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

GEKKO求解多解非线性方程组得错误解,如何获取目标解?

如何用GEKKO获取非线性方程组的多个解

我需要求解存在两个解的非线性方程组:
方程组图像

使用GEKKO编写的代码可运行,但仅得到其中一个不需要的解;此前尝试fsolve、Sympy nsolve等方法时,均遇到除零错误无法获取另一个解。现有代码如下:

from gekko import GEKKO
import math  # 原代码遗漏math模块导入
m = GEKKO()
x,y = [m.Var(1) for i in range(2)]
m.Equations([0.2618 == 0.2094 + x*(1-(1/y))**(1/y),\
             0.9200 == 1-math.e**((-((.5236-.2094)/x)**y))])
m.solve(disp=False)
print(x.value,y.value)

解决方案:调整初始值与约束引导求解器收敛到目标解

非线性数值解法依赖初始猜测值,GEKKO默认的IPOPT求解器会收敛到离初始值最近的局部解。要获取另一个解,可通过以下方式调整:

1. 修改变量初始值

尝试与当前解差异较大的初始值,引导求解器探索其他解区域:

from gekko import GEKKO
import math

# 求解第一个解(原初始值)
m1 = GEKKO()
x1, y1 = m1.Var(1), m1.Var(1)
m1.Equations([0.2618 == 0.2094 + x1*(1-(1/y1))**(1/y1),
              0.9200 == 1 - math.e**(-((0.5236-0.2094)/x1)**y1)])
m1.solve(disp=False)
print("解1:x=", x1.value[0], " y=", y1.value[0])

# 求解第二个解,设置新的初始值
m2 = GEKKO()
x2 = m2.Var(5)  # 初始值设为5,远离第一个解的区域
y2 = m2.Var(5)
m2.Equations([0.2618 == 0.2094 + x2*(1-(1/y2))**(1/y2),
              0.9200 == 1 - math.e**(-((0.5236-0.2094)/x2)**y2)])
m2.solve(disp=False)
print("解2:x=", x2.value[0], " y=", y2.value[0])

2. 添加变量约束避免除零与无效区域

通过lb(下限)限制变量取值,避免除零错误同时缩小求解范围:

# 优化后的第二个求解代码
m2 = GEKKO()
x2 = m2.Var(5, lb=1e-3)  # 防止x接近0导致除零
y2 = m2.Var(5, lb=1.01)  # 防止y=1导致(1-1/y)=0,避免指数项无意义
m2.Equations([0.2618 == 0.2094 + x2*(1-(1/y2))**(1/y2),
              0.9200 == 1 - m2.exp(-((0.5236-0.2094)/x2)**y2)])  # 用GEKKO内置exp提升稳定性
m2.solve(disp=False)
print("解2:x=", x2.value[0], " y=", y2.value[0])

3. 切换求解器

GEKKO支持APOPT等求解器,部分求解器在处理多解问题时更灵活,可通过solver参数切换:

m2.solve(disp=False, solver=1)  # 使用APOPT求解器

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 05:17:38