我试图了解如何设置python scipy最小化问题。 这是我从Excel Solver问题中获取的一个示例。 解释问题的最简单方法是尝试解决一个非常简单的电网:
R1: 100
R2: 1000
R3: 50
U: 10
三个电阻,两个并联(R2,R3),然后与R1串联。电源10伏
控制方程式
i1 - i2 - i3 = 0
U - i1*R1 - i2*R2 = 0
U - i1*R1 - i3*R3 = 0
通过最小化作为
给出的目标函数来找到i1,i2,i3的解(i1-i2-i3)**2 + (U-i1R1-i2R2)**2 + (U-i1*R1-i3R3)**2
如何在scipy leastsq中实现此问题?
我想使用leastsq的原因是因为我的实际网络要复杂得多并且包含非线性元素(它实际上不是电气网络,而是液压网络)。
非常感谢! 威廉
答案 0 :(得分:0)
首先定义实际的目标函数,它必须将未知变量作为参数
def objective(x):
i1, i2, i3 = x
R1 = 100
R2 = 1000
R3 = 50
U = 10
return (i1-i2-i3)**2 + (U-i1*R1-i2*R2)**2 + (U-i1*R1-i3*R3)**2
然后你提供一些关于你的电流的初步猜测
x0 = [1.0, 1.0, 1.0] # or whatever you want to start with
然后拨打minimize
from scipy.optimize import minimize
res = minimize(objective, x0)
如果您想指定a specific minimization algorithm,也可以传递method
参数。
另外,如果你可以定义雅可比矩阵(可能还有你的Hessian矩阵),你也可以通过分别传入jac
和hess
参数来使用基于梯度的方法,这些参数应该更快收敛