数值计算主要研究如何利用计算机更好地解决各种数学问题,包括连续系统离散化和离散型方程求解,并考虑误差、稳定性和收敛性等问题。
一、插值法插值问题是数值分析的基本问题之一,其原理就是在离散数据的基础上通过插补得到连续函数,使得这条连续曲线通过全部给定的离散数据点。利用插值法可以通过函数在有限个点处的取值状况估计出该函数在其他点处的值。1.1拉格朗日插值法-适合给出插值节点的情况SciPy库的interpolate模块提供了lagrange函数来进行Lagrange插值计算,其语法格式如下。
scipy.interpolate.lagrange(x,w)# x:接受 array,表示插值节点的x坐标。无默认值# w:接受 array,表示插值节点的y坐标,数目需要与x对应。无默认值假设有一个每年生产240吨产品的食品加工厂,需要统计生产费用,但由于该厂的各项资料不全,无法统计。这种情况下,统计部门收集了设备、生产能力和与该厂大致相同的5个食品加工厂的相关产量和生产费用的资料,如下表所示,请参考数据估计生产费用。
输出结果:
产量为240吨时,费用为:4.7142857142827665v
1.2牛顿插值法-适合给出插值节点的情况
结果输出:
产量为240吨时,费用为:4.7142857142857151.2样条插值
样条插值则是分段给出多个低次多项式通过的所有数据点。
SciPy库中的interpolate模块提供了UnivariateSpline类来进行一般的样条插值计算,其语法格式如下。
class scipy.interpolate.UnivariateSpline(x,y,w=None,bbox=[None,None],k=3,s=None,ext=0,check_finite=False)
# x:接受 array,表示插值节点的x坐标。无默认值
# y:接受 array,表示插值节点的y坐标,数目需要与x对应。无默认值
# w:接受 array,表示样条的拟合权重。默认为None
# k:接受 int,表示样条曲线的平滑程度,必须小于或等于5。默认为3
使用样条插值求解上例问题
输出结果:
产量为240吨时,费用为:4.714285714285714
通过对比结果可以发现,在整体插值效果上,样条插值和Lagrange插值、Newton插值相差不大,但是根据其原理,样条插值计算量更少,并且在计算机上的实现难度更低。但同时也需要注意,样条插值只能保证在各段小区间点上的连续性,无法保证整条曲线在整个大区间内绝对连续且光滑。
二、最小二乘线性拟合
数据拟合与插值相比,数据拟合不要求近似函数通过所有的数据点,而要求它反映原函数整体的变化趋势,而插值法在节点处取函数值。数据拟合最常用的方法是最小二乘法。SciPy库中optimize模块的least_squares函数提供了利用最小二乘法求解方程的功能,其语法格式如下。
使用最小二乘法求解纤维拉抻倍数与强度的线性拟合方程
import matplotlib.pyplot as plt
from scipy import optimize #导入库SciPy的interpolate模块
import numpy as np
# 拉伸倍数
x = np.array([1.9,2,2.1,2.5,2.7,2.7,3.5,3.5,4,4,4.5,4.6,5,5.2,6,6.3,6.5,7.1,8,8,8.9,9,9.5,10])
# 强度
y = np.array([1.4,1.3,1.8,2.5,2.8,2.5,3,2.7,4,3.5,4.2,3.5,5.5,5,5.5,6.4,6,5.3,6.5,7,8.5,8,8.1,8.1])
plt.rcParams['font.sans-serif']=['SimHei'] # 用来正常显示中文
plt.rcParams['axes.unicode_minus']=False # 用来正常显示负号
#定义误差
def regula(p):
'''
p:接收tuple、list,表示函数的系数,如ax+b中的a、b。无默认值
'''
a,b = p
return y - a*x-b
# 使用最小二乘法确定a和b
result = optimize.least_squares(regula,[1,0])
a,b = result.x #a,b存储在result的x下
print('线性拟合的结果:a为%s,b为%s'%(a,b))
print('线性拟合的结果展示:')
plt.figure(figsize=(6,4))
plt.scatter(x,y,label='真实值') #绘制原来的点
plt.plot(x,a*x+b,'r',label='拟合直线') #拟合直线
plt.legend()plt.title('纤维线性拟合')
plt.xlabel('拉伸倍数')
plt.ylabel('强度')
plt.xlim(0,11)
plt.ylim(0,9)
plt.savefig('D:/data/纤维线性拟合.png')
plt.show()
输出结果:
线性拟合的结果:a为0.8587342891022356,b为0.15047408914437352
线性拟合的结果展示:
三、 非线性曲线拟合
常见的非线性方程(组)求解问题有如下两种。
(1)求取给定范围内的某个解,而解的粗略位置事先已从问题的物理背景或其他方法得知。
(2)求取方程(组)的全部解,或者求取给定区域内的所有解,而解的个数和位置事先并不知道。这在超越方程的情形下是比较困难的。
例子:现有A、B两辆车,其中,B车在A车前方100m处;A车的初始速度为0,加速度为6m/s2;B车的速度为15m/s,加速度为1m/s2。试问,A车在哪个时间能够追上B车?
3.1、二分法求解非线性方程
针对上述第一种问题,二分法是最简单的一种方法。二分法也称为对分法(或逐次半分法),其基本思想是先确定方程f(x)=0含根的区间[a,b],再把区间逐次二等分。
结果输出:
3.2、迭代法求解非线性方程
迭代法是数值计算中最常用的一种方法,是一种逐次逼近的方法,其基本思想是先给出方程的一个近似值,然后反复利用某种迭代公式校正根的近似值,使近似根逐步精确化,直到得到满足精度要求的近似根为止。解:取初始点为1,取最大迭代次数为100,精度要求为10−2,迭代公式为:3.2、迭代法求解非线性方程迭代法是数值计算中最常用的一种方法,是一种逐次逼近的方法,其基本思想是先给出方程的一个近似值,然后反复利用某种迭代公式校正根的近似值,使近似根逐步精确化,直到得到满足精度要求的近似根为止。
解:取初始点为1,取最大迭代次数为100,精度要求为10−2,迭代公式为:
结果输出:
以上就是“python数值分析基础教程(python数值计算)”的详细内容,想要了解更多Python教程欢迎持续关注编程学习网。
扫码二维码 获取免费视频学习资料
- 本文固定链接: http://phpxs.com/post/10960/
- 转载请注明:转载必须在正文中标注并保留原文链接
- 扫码: 扫上方二维码获取免费视频资料