在修《数值计算方法》的时候写的大作业,用python实现的一个三样条插值函数。可以根据给定的点拟合出相应函数,代码如下
1.main.py
数据样本通过excel读入,格式如下。然后输入相应的边界条件,数学原理参考《数值计算方法》
import Spline
import other_function
def main():
filename=input("输入excel的名字(如sinx.xls):")
x,y=other_function.read_from_xls(filename)
# 创建一个三样条类
a=Spline.spline(x,y)
limit=eval(input("选择边界条件,1代表一型,2代表二型(如输入1):"))
# 输入三样一型边界
if limit==1:
n=eval(input("输入首端点一阶导(如1):"))
m=eval(input("输入末端点一阶导(如1):"))
a.first_limit(n,m)
# 三样条二型边界 ,这里只能调用一个,不要重复调用
if limit==2:
n = eval(input("输入首端点二阶导(如1):"))
m = eval(input("输入末端点二阶导(如1):"))
a.second_limit(n,m)
# 绘制三样条函数
a.draw_function()
#返回所有的三次函数
list=a.stander_cubic_fuction()
#以txt的格式写入所有结果
out_filename=input("输入输出文件名(如sinx):")
other_function.write_cubic_function(list,out_filename)
#寻找转折点
turn_point=a.find_turing()
turn_point_file = open(out_filename + "_turn", 'w')
turn_point_file.write('x: '+str(turn_point[1]))
turn_point_file.write('\n')
turn_point_file.write('y: '+str(turn_point[0]))
turn_point_file.close()
main()
Spline.random_test(10)
2.spline.py
实现三样条插值计算,其中包括
2.1追赶法解三对对角矩阵,参考:https://en.wikibooks.org/wiki/Algorithm_Implementation/Linear_Algebra/Tridiagonal_matrix_algorithm
2.2随机生成点的测试函数
2.3三样条插值参考西北工业大学出版社《数值计算方法》
#追赶法解三对角矩阵
import numpy as np
import matplotlib.pyplot as plt
import random
import other_function
def TDMAsolver(a, b, c, d):
nf = len(d) # number of equations
ac, bc, cc, dc = map(np.array, (a, b, c, d)) # copy arrays
for it in range(1, nf):
mc = ac[it - 1] / bc[it - 1]
bc[it] = bc[it] - mc * cc[it - 1]
dc[it] = dc[it] - mc * dc[it - 1]
xc =