Python中使用Muller法求解复根报错,如何调整代码获取虚数解?
问题描述
我实现了如下的mullet_method函数代码:
def mullet_method(f,p0,p1,p2,TOL,N0): h1=p1-p0 h2=p2-p1 d1=(f(p1)-f(p0))/h1 d2=(f(p2)-f(p1))/h2 a=(d2-d1)/(h2+h1) i=3 s=" " print("-"*100) print("n", s*6, "Pₙ₋3", s*8, "Pₙ₋2", s*9, "Pₙ-1", s*9, "Pₙ", s*9, "f(Pₙ)",s*5, "Tolerance") while(i<=N0): b = d2+h2*a d=(b**2-4*f(p2)*a)**(1/2) if (abs(b-d)<abs(b+d)): e=b+d else: e=b-d h=-2*f(p2)/e p=p2+h #print(i,p0,p1,p2,p,f(p)) print( "{:0>2}".format(str(i)), s,\ "%+.6f"%p0, s,\ "%+.6f"%p1, s,\ "%+.6f"%p2, s,\ "%f"%p, s,\ "%+.6f"%f(p), s,\ "%+.6f" %h) if((abs(h)<=TOL)): return p0=p1 p1=p2 p2=p h1=p1-p0 h2=p2-p1 d1=(f(p1)-f(p0))/h1 d2=(f(p2)-f(p1))/h2 a=(d2-d1)/(h2+h1) i+=1
当代入方程 f(x) = x^4 − 7.79075x^3 +14.7445x^2 + 2.511x −1.674 = 0 时,程序提示必须是实数而非复数,请问需要进行哪些调整才能输出虚数解?
调整方案
要让程序支持复数解,需从以下几个方面修改代码:
将迭代初始值转为复数类型
在函数开头把p0、p1、p2转换为复数,确保后续所有运算自动使用复数算术,避免开平方时因负数报错:p0 = complex(p0) p1 = complex(p1) p2 = complex(p2)适配复数的格式化输出
原代码的%+.6f仅支持实数,需替换为能处理复数的格式逻辑,比如:def format_complex(num): if abs(num.imag) < 1e-9: return "{:+.6f}".format(num.real) else: return "{:+.6f}{:+.6f}j".format(num.real, num.imag) # 替换原打印语句 print( "{:0>2}".format(i), s, format_complex(p0), s, format_complex(p1), s, format_complex(p2), s, format_complex(p), s, format_complex(f(p)), s, format_complex(h) )这样会根据数值是否有有效虚部,自动切换输出格式。
调整收敛判断逻辑(可选)
原代码的abs(h)<=TOL可以保留,因为复数的abs()会计算模长,适合作为收敛判断依据。如果需要更严格的精度控制,可以分别检查实部和虚部的误差:if abs(h.real) <= TOL and abs(h.imag) <= TOL: return确保目标函数支持复数输入
你的多项式函数天然兼容复数运算,只需保证定义时直接使用Python的算术运算符即可:def f(x): return x**4 - 7.79075*x**3 +14.7445*x**2 +2.511*x -1.674
内容的提问来源于stack exchange,提问作者Muhammad Hilmi Faidzal
相关产品推荐
相关产品推荐

