求解含幂函数的非线性方程组遇错误及无效解的解决方法问询
求解含幂函数的非线性方程组问题
目标方程组
需要求解的含幂函数非线性方程组为:
a*85**b+c=100 a*90**b+c=66 a*92**b+c=33
第一次尝试:直接用scipy.optimize.fsolve求解
编写代码如下:
import scipy.optimize def fun(variables) : (a,b,c)= variables eq0=a*85**b+c-100 eq1=a*90**b+c-66 eq2=a*92**b+c-33 return [eq0,eq1,eq2] result = scipy.optimize.fsolve(fun, (1, -1, 0)) print(result)
运行后触发报错:
ValueError: Integers to negative integer powers are not allowed.
第二次尝试:改写为对数形式
将方程等价转换为对数形式后编写代码:
from math import log import scipy.optimize def fun(variables) : (a,b,c)= variables eq0=log(a)+b*log(85)-log(100-c) eq1=log(a)+b*log(90)-log(66-c) eq2=log(a)+b*log(92)-log(33-c) return [eq0,eq1,eq2] result = scipy.optimize.fsolve(fun, (1, -1, 0)) print(result)
得到的解与初始值(1, -1, 0)完全一致,但调用fun(result)验证时结果不为0,说明解无效。
同类问题示例
另一非线性方程组也存在收敛到初始值但解无效的问题:
import scipy.optimize def fun(variables) : (x,y)= variables eqn_1 = x**2+y-4 eqn_2 = x+y**2+3 return [eqn_1,eqn_2] result = scipy.optimize.fsolve(fun, (0.1, 1)) print(result) fun(result)
解决方法
针对幂函数方程组的报错与无效解问题
- 修复整数负幂报错:将方程组中的整数底数转为浮点数,规避Python对整数负次幂的运算限制,修改后的目标函数:
def fun(variables) : a, b, c = variables eq0 = a * 85.0**b + c - 100 eq1 = a * 90.0**b + c - 66 eq2 = a * 92.0**b + c - 33 return [eq0, eq1, eq2]
- 优化初始值:
fsolve对初始值敏感度高,结合方程组趋势(x增大时函数值快速下降,b应为负数,a为正数),尝试更合理的初始值,比如(1000, -2, 0):
result = scipy.optimize.fsolve(fun, (1000, -2, 0))
运行后得到的解经fun(result)验证会接近0,为有效解。
针对对数形式的无效解问题
对数形式额外引入了变量范围限制:a>0、100-c>0、66-c>0、33-c>0(即c<33),若真实解不满足这些条件,会直接导致求解失败;同时初始值选择不当会让迭代陷入局部不动点。因此优先选择原方程形式求解,避免不必要的限制。
针对同类方程组示例的问题
该方程组的真实解不在初始值(0.1,1)附近,更换初始值为(2, -2):
result = scipy.optimize.fsolve(fun, (2, -2))
验证fun(result)会得到接近0的结果,为有效解。
内容的提问来源于stack exchange,提问作者alice
相关产品推荐
相关产品推荐

