这周《工程优化方法》学到了三次插值法,编写了一段python小程序对课后习题进行一个模拟
import math
def fx(x): #计算函数值
output = x**4 - 4*x**3 - 6*x**2 - 16*x + 4
return output
def f_x(x): #计算导数值
output = 4*x**3 - 12*x**2 - 12*x - 16
return output
def cal_num(a,b): #计算插值参数
h = b-a
A = (h*(f_x(b)+f_x(a)) + 2*(fx(a)+fx(b)))/(h**3)
B = (3*(fx(b)-fx(a)) - h*(f_x(b)+2*f_x(a))) / (h**2)
C = f_x(a)
D = fx(a)
#print("A={} B={} C={} D={}".format(A,B,C,D))
x = a - C/(B + math.sqrt(abs(B*B - 4*A*C)))
#print("fx=",fx(x))
f = fx(x)
f_ = f_x(x)
return [A,B,C,D,x,f,f_]
def funIfContinue(f_,epseno): #判断是否继续循环
if abs(f_) <= epseno:
return False
else:
return True
def main(a,b,epseno):
count = 1 #次数
while True:
resList = cal_num(a,b)
print("====第{}次迭代====".format(count))
print("A={},B={},C={},D={},x={},fx={},f_x={}".format(resList[0],resList[1],resList[2],resList[3],resList[4],resList[5],resList[6]))
if funIfContinue(resList[-1],epseno) :
if resList[-1] < 0 :
a = resList[4]
else:
b = resList[4]
count+=1
else:
break
main(3,7,0.001)
迭代效果还是不错的,基本上两万次之内能让精度收敛在0.001,按课本要求精度0.5四次即可。: