为搜索区域添加边界可以帮助定位特定的解.
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 course的Module 10(木星笔记本).