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

修改Python多项式求根代码:让自定义函数适配任意系数

解决Python多项式求解中函数系数无法传递的问题

你的代码核心问题是变量作用域不匹配:my_func里引用的a、b、c、d、e没有在自身作用域内定义,它会尝试查找全局变量,但你调用polynomial_root时传入的参数是局部变量,无法被my_func访问——这就是只有当系数全为1(全局变量默认值或手动定义全局变量)时才有效的原因。

下面给出两种简洁的修改方案:

方案一:给my_func添加系数参数,用lambda绑定调用

修改my_func让它接受系数参数,调用时通过lambda把系数绑定进去,适配print_format的单参数函数要求:

import numpy as np

def polynomial_root(a,b,c,d,e):
    p = np.poly1d([a,b,c,d,e])
    roots = p.roots
    return roots

def my_func(x, a, b, c, d, e):
    return a*x**4 + b*x**3 - c*x**2 + d*x - e

def print_format(x, f):
    for root in x:
        print(f"x={root:.6f}\t\t f(x)={f(root):.6f}")

# 定义目标多项式的系数
a_coeff, b_coeff, c_coeff, d_coeff, e_coeff = 8., 3., -2., 8., -2
roots = polynomial_root(a_coeff, b_coeff, c_coeff, d_coeff, e_coeff)

print("方程f(x) = 8x**4 + 3x**3 - 2x**2 + 8x - 2的解为:")
# 用lambda绑定系数,生成符合print_format要求的单参数函数
print_format(roots, lambda x: my_func(x, a_coeff, b_coeff, c_coeff, d_coeff, e_coeff))

方案二:用闭包生成带固定系数的多项式函数

通过工厂函数创建绑定了系数的my_func,代码更简洁直观:

import numpy as np

def polynomial_root(a,b,c,d,e):
    p = np.poly1d([a,b,c,d,e])
    roots = p.roots
    return roots

def create_polynomial(a, b, c, d, e):
    # 闭包捕获系数,返回只接受x的函数
    def my_func(x):
        return a*x**4 + b*x**3 - c*x**2 + d*x - e
    return my_func

def print_format(x, f):
    for root in x:
        print(f"x={root:.6f}\t\t f(x)={f(root):.6f}")

# 定义目标多项式的系数
a_coeff, b_coeff, c_coeff, d_coeff, e_coeff = 8., 3., -2., 8., -2
roots = polynomial_root(a_coeff, b_coeff, c_coeff, d_coeff, e_coeff)
# 创建绑定了系数的多项式函数
poly_func = create_polynomial(a_coeff, b_coeff, c_coeff, d_coeff, e_coeff)

print("方程f(x) = 8x**4 + 3x**3 - 2x**2 + 8x - 2的解为:")
print_format(roots, poly_func)

额外优化说明

  • 把print_format里的固定循环次数改成for root in x,适配不同次数的多项式,代码更通用。
  • 用:.6f格式化输出,避免过长的小数位,结果更整洁。

内容的提问来源于stack exchange,提问作者user21334604

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 01:52:31