从scipy教程我不太了解optimize.minimize的工作原理。 我想在以下方程组中最小化c3:
0 = cos(b1)+ cos(b2)- 0.0166
0 = sin(b1)+ sin(b2)+ 0.3077*c3 - 0.6278
0 = cos(b1)- cos(b2)+ 5.4155*c3 - 4.3547
间隔:
c3[0,1]
b1,b2[0,2*pi]
这是我的代码:
def fun(x):
return 4.9992-5.7233*x[0]-2*np.cos(x[2])-np.sin(x[2])-np.sin(x[1])
bnds = ((0,1),(0,2*np.pi),(0,2*np.pi))
i = optimize.minimize(fun, (0.05,np.pi*0.5,np.pi), method='SLSQP', bounds=bnds)
输出
status: 0
success: True
njev: 6
nfev: 30
fun: -3.9601679766628886
x: array([ 1. , 1.57079633, 0.46367497])
message: 'Optimization terminated successfully.'
jac: array([ -5.72330004e+00, 0.00000000e+00, 6.11841679e-05,
0.00000000e+00])
nit: 6
结果在L-BFGS-B
中相同我的理解是这里c3已经变为1仍然可以,但我希望它更低。如果我在函数上应用fsolve
,它会找到c3 = 0.46的根。
顺便说一句为什么我必须在代码中写x [0],x [1]和x [2]而不是c3,b1,b2?
使用约束是否有更聪明的方法,例如?
答案 0 :(得分:3)
对于3个变量 b1 , b2 和 c3 ,您有三个超越方程式。你需要做的是为变量求解这3个方程。由于方程式是超越的,因此可能没有解决方案,一种解决方案或许多解决方案。使用 Mathematica 解决它们:
In[30]:= eq1 = 0 == Cos[b1] + Cos[b2] - 0.0166;
eq2 = 0 == Sin[b1] + Sin[b2] + 0.3077*c3 - 0.6278;
eq3 = 0 == Cos[b1] - Cos[b2] + 5.4155*c3 - 4.3547;
In[42]:= Reduce[{eq1, eq2, eq3, b1 >= 0, b1 <= 2*Pi, b2 >= 0,
b2 <= 2*Pi, c3 >= 0, c3 <= 1}, {b1, b2, c3}]
During evaluation of In[42]:= Reduce::ratnz: Reduce was unable to solve the system with inexact coefficients. The answer was obtained by solving a corresponding exact system and numericizing the result. >>
Out[42]= b1 == 0.214076 && b2 == 2.85985 && c3 == 0.446303
所以实际上只有一种解决方案。现在你也可以使用root
以数字方式找到这个方程组的解决方案:
import scipy as sp
import scipy.optimize
def f(x):
b1, b2, c3 = x
e1 = sp.cos(b1) + sp.cos(b2) - 0.0166
e2 = sp.sin(b1) + sp.sin(b2) + 0.3077*c3 - 0.6278
e3 = sp.cos(b1) - sp.cos(b2) + 5.4155*c3 - 4.3547
return e1, e2, e3
res = sp.optimize.root(f, [0.5, 1.0, 1.0])
print('b1 = {}, b2 = {}, c3 = {}'.format(*res.x))
给出:
b1 = 0.214076256767, b2 = 2.85985240432, c3 = 0.446302998585
你对minimize
所做的是最小化三个方程的总和,这三个方程不等于&#34;最小化方程组中的c3&#34;。
minimize
不符合您的要求。 &#39;最小化&#39;做最小化的事情找到最小化f(x) = x**2
的x。答案显然是&#39; x = 0&#39;。
你必须写&#39; x [0]&#39;因为&#39;最小化&#39;的界面。该函数只是希望你以矢量形式给出你想要最小化的参数。