2023年6月29日发(作者:)
数值分析-劈因⼦法(贝尔斯托法)python3实现版权声明:本⽂为博主原创⽂章,未经博主允许不得转载。 /zzy123zzy123_/article/details/78169695"""贝尔斯托法:与⽜顿法有松散关系的⼀种迭代⽅法,为求多项式的复根公式:f5(x)=(x+1)(x-6)(x+7)(x-2)(x+3)⽬的:求的该⽅程式的复根具体⽅法:①多项式迭代除去⼆次因式,x^2-r*x-s,可以得到复根 为什么除以⼆次因式可以得到复根:②求偏导数③得到r和s以此改进 计算误差 r和s 误差均低于给定的终⽌条件时可以得到根④结果可能: 1.三阶或者以上以r,s为初始值应⽤ 2.商是⼆次可利⽤求根公式得到值 3.商为⼀次多项式 由单根公式得到补充:⽜顿法-⾼阶⽅程求根存在复根情况具体⽅法:构造复变函数,x是复数⼆元实值函数复合定义域以及函数值对⽜顿迭代公式的f(x)和F‘(x)除以因式得最终表达式"""import ursionlimit(10000) #例如这⾥设置为⼀百万 递归深度不够#RecursionError: maximum recursion depth exceeded in comparison#1073741571错误是栈溢出,系统默认的栈空间⼤⼩是1MBprint('贝尔斯托法求解多项式f(x)=x^5-3.5*x^4+2.75*x^3+2.125*x^2-3.875*x+1.25的根,使⽤初始估计r=s=-1并迭代满⾜条件t=1%')i = 0 # 循环标记量#数组存储函数式得各个系数a = [1.25,-3.875,2.125,2.75,-3.5,1]#依次存放a0,b = ['b0', 'b1', 'b2', 'b3', 'b4', 'b5']c = ['c0','c1','c2','c3','c4','c5']rs=[-1,-1,'r','s']#上⼀次的rs和这⼀次rsrs_0 = ['%r','%s']#误差分析n = 5 #代表多项式的项数x = ['x0','x1','x2','x3','x4']n_0=[3,1]#求Bdef B(r,s): global i i = 3 b[5]=round(a[5],5)#bn = an b[4]=round(a[4]+r*b[5],5) while i!=-1: b[i]=round(a[i]+r*b[i+1]+s*b[i+2],5) i=i-1#求Cdef C(r,s): global i i = 3 c[5]=round(b[5],4) c[4]=round(b[4]+r*c[5],4) while i!=-1: c[i] = round(b[i]+r*c[i+1]+s*c[i+2],5) i = i-1#计算当前r,s存⼊rs[]def Analays(): r = (b[0]*c[3]-b[1]*c[2])/(c[2]*c[2]-c[1]*c[3])+rs[0] r = (b[0]*c[3]-b[1]*c[2])/(c[2]*c[2]-c[1]*c[3])+rs[0] s = (b[0]*c[2]-b[1]*c[1])/(c[3]*c[1]-c[2]*c[2])+rs[1] rs[2] = round(r, 4) rs[3] = round(s, 4)#误差分析,存⼊rs_0[]def Error(): rs_0[0]=round((rs[2]-rs[0])/rs[2],5) rs_0[1]=round((rs[3]-rs[1])/rs[3],5) rs[0]=rs[2] rs[1]=rs[3]w = 0#题设题解的下标j = 0#存放答案的下标count = 0#标记迭代次数def Result(r,s):#贝尔斯托法计算结果 global n,w,j,count count = count+1 B(r, s) C(r, s) Analays() Error() if (abs(rs_0[0])<0.01)|(abs(rs_0[1])<0.01): #误差满⾜条件 print('经过',count,'次迭代得') x[j] = (rs[2]+(rs[2]**2+4*rs[3])**(1/2))/2 # 4 print('x',j,'=',x[j]) j = j + 1 x[j] = (rs[2]-(rs[2]**2+4*rs[3])**(1/2))/2 # 3 print('x',j,'=',x[j]) j =j+1 n = n_0[w] # n代表当前计算多项式项数 w=w+1 if n == 1: x[4] = round((-rs[2]) / rs[3],0) # 单项式求解 print('x', 4, '=', x[4]) print('多项式的根:',x) elif (n == 2): print('⼆次项求实根:此题⽬不需计算') elif (n > 2):#传⼊修正的r,s值 商作为因式迭代 count = 0 a[0] =b[2] a[1] = b[3] a[2] = b[4] a[3] = b[5] a[4] = 0 a[5] = 0 Result(rs[2], rs[3]) else:#不满⾜近似条件 Result(rs[2],rs[3])#⽤修正的值继续迭代Result(-1,-1)#调⽤结果:贝尔斯托法求解多项式f(x)=x^5-3.5*x^4+2.75*x^3+2.125*x^2-3.875*x+1.25的根,使⽤初始估计r=s=-1并迭代满⾜条件t=1%经过 4 次迭代得x 0 = 0.5x 1 = -1.0经过 5 次迭代得x 2 = (1+0.49939963956735095j)x 3 = (1-0.49939963956735095j)x 4 = 2.0多项式的根: [0.5, -1.0, (1+0.49939963956735095j), (1-0.49939963956735095j), 2.0]Process finished with exit code 0
发布者:admin,转转请注明出处:http://www.yc00.com/news/1687977424a62862.html
评论列表(0条)