我正在试着解多个非线性方程的系统,类似于这个:

System of Equations with Graph

如图所示,该系统有两种解决方案.通过反复试验和不同的方法(融合等)来实现这一点,我偶然发现了Gekko,因此如下所示:

from gekko import GEKKO
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)

这段代码成功地求解了系统,但是它输出了不正确的解.我想不出怎么才能买到另一件(就是我需要的那件).有什么壁虎专家可以帮忙吗?谢谢!

我try 了多种不同的方法来解决非线性系统(fsolve、sympy nsolve等),但始终遇到无法解决的被零除的错误.其他求解系统的方法都没有给出解决方案.我找不到合适的文档让Gekko想出如何获得另一种解决方案.

推荐答案

为搜索区域添加边界可以帮助定位特定的解.

from gekko import GEKKO
m = GEKKO(remote=False)
x,y = m.Array(m.Var,2,value=1)
m.Equations([0.2618 == 0.2094 + x*(1-(1/y))**(1/y),\
             0.9200 == 1-m.exp((-((.5236-.2094)/x)**y))])

y.LOWER = 0
m.solve(disp=False)
print(f'Solution: x={x.value[0]:0.2f} y={y.value[0]:0.2f}')

x.UPPER = 10; x.LOWER = 0
y.UPPER = 0; y.LOWER = -1
m.solve(disp=False)
print(f'Solution: x={x.value[0]:0.2f} y={y.value[0]:0.2f}')

这就给出了解决方案:

Solution: x=0.16 y=1.32
Solution: x=6.85 y=-0.30

如果无法指定约束条件,则使用multi-start method来try 不同的初始猜测值.对于变量很多且不知道所有解决方案的问题,这通常是必需的.对于两个变量的问题,指定y.value个初始猜测值以找到两个解.

from gekko import GEKKO
m = GEKKO(remote=False)
x,y = m.Array(m.Var,2)
m.Equations([0.2618 == 0.2094 + x*(1-(1/y))**(1/y),\
             0.9200 == 1-m.exp((-((.5236-.2094)/x)**y))])

y.value = -1
m.solve(disp=False)
print(f'Solution: x={x.value[0]:0.2f} y={y.value[0]:0.2f}')

y.value = 1
m.solve(disp=False)
print(f'Solution: x={x.value[0]:0.2f} y={y.value[0]:0.2f}')

这也提供了两种解决方案:

Solution: x=6.85 y=-0.30
Solution: x=0.16 y=1.32

Sympy可以找到简单问题的所有解决方案.参见Data Science courseModule 10(木星笔记本).

Python-3.x相关问答推荐

Python多处理池:缺少一个进程

如何将值映射到具有上限和下限的新列

在Pandas中,根据另一列中的重复值将数据分组为一列

基于其他列的条件向Panda数据框中添加值到新列

将值从函数传递到标签

如何通过 python 使用 auth no priv 获取 SNMPv3?

GEKKO 在没有不等式的模型中抛出不等式定义错误

Keras 中 Conv2D 层的意外结果

为什么 return node.next 会返回整个链表?

是否可以将多个 if 转换为数组?

Pandas 将列格式化为货币

使用 Python3 与 HDFS 交互的最佳模块是什么?

__cause__ 和 __context__ 有什么区别?

Asyncio RuntimeError:事件循环已关闭

当 None 被传递时,如何将默认值应用于 python 数据类字段?

谁能给我一个 Python 3 中标准输入和标准输出的快速教程?

什么是ANSI_X3.4-1968编码?

python中的绝对导入是什么?

如何使用异步 for 循环遍历列表?

如何将python日志(log)级别名称转换为整数代码