数值分析实验——三次样条插值
GoatWu
一、程序摘要
此程序使用 python3.7 语言编写。引入了外部库函数 numpy 作为数学工具解方程,matplotlib 作为画图工具。由于需要多步运行,对不同的参数进行绘图,因此使用了 jupyter-notebook 作为编写工具。
由于用到的函数较多,为了安全起见,此程序将内部函数封装在了 Functions.py 模块中,将接口函数封装在了 spline.py 模块中。在 spline.py 中,我们引用了 Functions.py 的内部函数;在主程序中,我们只需要引入 spline 模块即可:import spline as sp
。
程序有两个接口。第一个接口函数的功能是,对于给定的函数,在给定的范围中均匀选点,然后进行三次样条插值进行拟合;第二个接口函数的功能是,对于给定的点集与边界条件,将这些点利用三次样条插值进行拟合。下面我们将逐一呈现。
二、程序功能
1. 给定函数的拟合
接口:sp.give_func(func = F.runge, beg = -5, end = 5, segments = 10)
参数意义:
func
:需要拟合的函数。默认值为 Functions 中的龙格函数beg
:拟合范围的左端点end
:拟合范围的右端点segments
:拟合的区间个数,也即点的个数减 1 1 1
使用示例:
sp.give_func()
:
在 [ − 5 , 5 ] [-5,5] [−5,5] 的范围内用 10 10 10 段拟合龙格函数
sp.give_func(beg = -5, end = 5, segments = 6)
:
在 [ − 5 , 5 ] [-5,5] [−5,5] 的范围内用 6 6 6 段拟合龙格函数。
-
def f(x): return (x * x * x + 6 * x * x + 7 * x + 1) / (x * x + 1); sp.give_func(f, -4, 4, 8)
对自定义的函数 f ( x ) = x 3 + 6 x 2 + 7 x + 1 x 2 + 1 f(x)=\frac{x^3+6x^2+7x+1}{x^2+1} f(x)=x2+1x3+6x2+7x+1 ,分 8 8 8 段 在区间 [ − 4 , 4 ] [-4,4] [−4,4] 来拟合函数。
2. 给定点集的拟合
接口:sp.give_nodes(x, y, opt = 0, lval = 0, rval = 0)
参数意义:
x
:给定点集的 x x x 坐标数组y
:给定点集的 y y y 坐标数组opt
:插值的边界条件opt = 0
:默认边界条件,左右两端点处的三阶导与前一端点处三阶导相等opt = 1
:给定左右两端点的一阶导,分别为lval
和rval
。opt = 2
:给定左右两端点的二阶导,分别为lval
和rval
。
使用示例:
x = x = [27.7, 28, 29, 30]
y = [4.1, 4.3, 4.1, 3.0]
sp.give_nodes(x, y)
:
对给定的点集用默认边界条件来拟合。
sp.give_nodes(x, y, opt = 1, lval = 3.0, rval = -4.0)
:
给定左右边界端点的一阶导来拟合。
sp.give_nodes(x, y, opt = 2, lval = 27.0, rval = -34.0)
:
给定左右边界端点的二阶导来拟合。
3. 给出各分段的三次函数表达式
三、程序的鲁棒性
1. 无给定函数的提示
对于给定函数的拟合,在无输入函数的情况下,默认使用龙格函数,并弹出提示:
2. 错误的 opt
参数
对于给定点集的拟合,如果 opt
参数不为有意义的值,返回错误:
3. 额外的 lval
或 rval
值
对于给定点集的拟合,如果 opt = 0
下,仍给出lval
或 rval
值,返回错误:
4. 给定点集的 x
和 y
长度不等
对于给定点集的拟合,如果 x
数组和 y
数组长度不等,返回错误:
四、部分程序运行结果
1. 给定函数的拟合
1.1. 龙格函数
1.2. 给定其他函数
2. 给定点集的拟合
2.1. 默认情况
2.2. 给定一阶导的边界条件
2.3. 给定二阶导的边界条件
五、程序源代码
1. Functions.py
import math
import numpy as np
import matplotlib.pyplot as plt
def runge(y):
y = np.float32(y)