数值分析Python实现系列—— 一、拉格朗日插值法

一、拉格朗日插值法

1.原理:

拉格朗日插值法:给定n个观测值(xk,yk)找到一组(n个)基函数 lk(x)  , 使得L(x) 为这组基函数的线性组合,并且使得L(x)是经过这些点的多项式

我们发现其中的一种找发是  :  满足这样线性组合的系数 是 观测值yk (n个)

满足这样线性组合的基函数形如:

2.Python实现:

思路:

1.观察发现基函数的分母与x无关,是观测值x的组合,可以先计算出来,留着以后用

2.每一个预测值先计算分子,再把每一个分子乘以每一个预测值,除以每一个分母,最终加和

3.使用matplotlib里的plot展示结果,蓝色点为观测值,红色点为预测值

 1 import matplotlib.pyplot as plt
 2 from functools import reduce
 3 # % matplotlib inline (jupyter notebook用户建议打开)
 4
 5
 6 def lagrange():
 7     points = eval(input("输入一个包含2个以上坐标的列表:"))
 8     pre = eval(input("输入预测值列表:"))
 9     length = len(points)
10     result = []
11     # l_k_den用于存储每一个基函数的分母数值(在计算不同预测值时可以共用)
12     l_k_den = [reduce(lambda x, y: x * y, [num[0] - i[0] for i in points if i[0] != num[0]]) for num in points]
13     for number in pre:
14         # l_k_num用于存储每一个基函数的分子数值(每一个预测值都不一样)
15         l_k_num = [reduce(lambda x, y: x * y, [number - i[0] for i in points if i[0] != one[0]]) for one in points]
16         result.append(sum([l_k_num[i] * points[i][1] / l_k_den[i] for i in range(length)]))
17     plt.plot([i[0]for i in points], [i[1] for i in points], ‘b*‘)
18     plt.plot(pre, result, ‘r*‘)
19     plt.show() # pycharm用户建议使用
20
21
22 lagrange()

3.效果展示:

Pycharm:

输入:

输出:

jupyter中:

输入输出:

4.学习总结:

  1. reduce() 函数会对参数序列中元素进行累积。 语法: reduce(function, iterable[, initializer])  例子: reduce(lambda x, y: x+y, [1,2,3,4,5]) # 使用 lambda 匿名函数 结果:17

原文地址:https://www.cnblogs.com/MyBlog-MrY/p/10847938.html

时间: 2024-08-26 10:34:54

数值分析Python实现系列—— 一、拉格朗日插值法的相关文章

Python实现拉格朗日插值法

已知sinx的一组x,y对应关系,用拉格朗日插值法估计sin(0.3367)的值. x x0.32 0.34 0.36 y 0.314567 0.333487 0.352274 // class Interpolation: def __init__(self, x, y): self.x = x self.y = y def func(self, X): s = 0 for i in range(len(self.x)): W = 1 w = (X - self.x[i]) for j in

拉格朗日插值法(图文详解)

在数值分析中,拉格朗日插值法是以法国十八世纪数学家约瑟夫·拉格朗日命名的一种多项式插值方法.许多实际问题中都用函数来表示某种内在联系或规律,而不少函数都只能通过实验和观测来了解.如对实践中的某个物理量进行观测,在若干个不同的地方得到相应的观测值,拉格朗日插值法可以找到一个多项式,其恰好在各个观测的点取到观测到的值.这样的多项式称为拉格朗日(插值)多项式.数学上来说,拉格朗日插值法可以给出一个恰好穿过二维平面上若干个已知点的多项式函数.拉格朗日插值法最早被英国数学家爱德华·华林于1779年发现[1

MATLAB实现拉格朗日插值法

开始学习MATLAB(R和Python先放一放...),老师推荐一本书,看完基础就是各种算法...首先是各种插值.先说拉格朗日插值法,这原理楼主完全不懂的,查的维基百科,好久才看懂.那里讲的很详细,这里就不在赘述了.关于MATLAB的实现,查了很多资料,下面的版本最好理解. %lagran1.m %求拉格朗日插值多项式和基函数 %输入的量:n+1个节点(x_i,y_i)(i = 1,2, ... , n+1)横坐标向量X,纵坐标向量Y %输出的量:n次拉格朗日插值多项式L,基函数l functi

Python学习系列(八)( 面向对象基础)

 Python学习系列(八)( 面向对象基础) Python学习系列(七)( 数据库编程) 一,面向对象 1,域:属于一个对象或类的变量.有两种类型,即实例变量—属于每个实例/类的对象:类变量—属于类本身. 2,类的方法:对象也可以使用属于类的函数来具有功能,这样的函数称之为类的方法.域和方法合称为类的属性.类使用class关键字创建,类的属性被列在一个缩进块中. 3,self:类的方法与普通的函数只有一个特别的区别----他们必须有一个额外的第一个参数名称,但是在调用的时候不能为其赋值,Pyt

Python学习系列(六)(模块)

一,模块的基本介绍 1,import引入其他标准模块 标准库:Python标准安装包里的模块. 引入模块的几种方式: i)引入模块:import   moduleName ii)引入模块下的函数:from moduleName import function1,function2,-- iii)引入模块下的所有函数:from moduleName import * 使用模块里的函数的方法: moduleName.function(agrs) 示例: >>> import math >

在Java中实现拉格朗日插值法

拉格朗日插值法的定义(引自维基百科) 对某个多项式函数,已知有给定的k + 1个取值点: (x0,y0),(x1,y1),(x2,y2),??,(xk,yk) 其中xj对应着自变量的位置,而yj对应着函数在这个位置的取值. 假设任意两个不同的xj都互不相同,那么应用拉格朗日插值公式所得到的拉格朗日插值多项式为: 其中每个为拉格朗日基本多项式(或称插值基函数),其表达式为: 具体的Java代码: 1 import java.util.Scanner; 2 3 4 public class Lagr

人脸检测及识别python实现系列(4)——卷积神经网络(CNN)入门

人脸检测及识别python实现系列(4)--卷积神经网络(CNN)入门 上篇博文我们准备好了2000张训练数据,接下来的几节我们将详细讲述如何利用这些数据训练我们的识别模型.前面说过,原博文给出的训练程序使用的是keras库,对我的机器来说就是tensorflow版的keras.训练程序建立了一个包含4个卷积层的神经网络(CNN),程序利用这个网络训练我的人脸识别模型,并将最终训练结果保存到硬盘上.在我们实际动手操练之前我们必须先弄明白一个问题--什么是卷积神经网络(CNN)? CNN(Conv

人脸检测及识别python实现系列(2)——识别出人脸

人脸检测及识别python实现系列(2)--识别出人脸 从实时视频流中识别出人脸区域,从原理上看,其依然属于机器学习的领域之一,本质上与谷歌利用深度学习识别出猫没有什么区别.程序通过大量的人脸图片数据进行训练,利用数学算法建立建立可靠的人脸特征模型,如此即可识别出人脸.幸运的是,这些工作OpenCV已经帮我们做了,我们只需调用对应的API函数即可,先给出代码: #-*- coding: utf-8 -*- import cv2 import sys from PIL import Image d

(原创)Python字符串系列(1)——str对象

在本博客 <Python字符串系列> 中,将介绍以下内容: Python内置的str对象及操作 字符串的格式化 Python中的Unicode字符串 Python中的正则表达式 re模块 本文将介绍Python内置的 str 类型,列举Python中字符串对象支持的方法,使用这些方法可以实现强大的字符串处理功能. 在Python 2 中,普通字符串与Unicode字符串有着明确的区分,二者都是Python内置的基本类型,例如: >>> type(str) <type '