You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 01:34:53