修改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
相关产品推荐
相关产品推荐

