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

求解含幂函数的非线性方程组遇错误及无效解的解决方法问询

求解含幂函数的非线性方程组问题

目标方程组

需要求解的含幂函数非线性方程组为:

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)

解决方法

针对幂函数方程组的报错与无效解问题

  1. 修复整数负幂报错:将方程组中的整数底数转为浮点数,规避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]
  1. 优化初始值: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 00:05:23