Welche Variable wird durch scipy.optimize minimiert.minimieren / Wie funktioniert das?

Von scipy Tutorial Ich weiß nicht wirklich, wie optimize.minimize funktioniert. Ich möchte c3 in folgenden Satz von Gleichungen minimieren:

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 

In Intervallen:

  • Wie benutzt man effektiv reguläre Ausdrücke, um alliterative Ausdrücke zu finden?
  • Lesen von Zellenwert mit angewandtem Zahlenformat openpyxl? - redux
  • Aufbau einer nxn Matrix in Python numpy, für jeden n
  • Wie man ein nutzbares Tensorprodukt von zwei Matrizen in Python erzeugt
  • Puffergefrierlisten Deinstallierte Pakete
  • Wie mache ich IPython organisieren Tab-Abschluss Möglichkeiten nach Klasse?
  •  c3[0,1] b1,b2[0,2*pi] 

    Hier ist mein Code:

     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) 

    Der Ausgang ist

      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 

    Das Ergebnis ist das gleiche in L-BFGS-B Mein Verständnis ist, dass hier c3 1 geworden ist, was immer noch ok ist, aber ich wollte es niedriger sein. Wenn ich fsolve auf die Funktion fsolve , findet sie eine Wurzel für c3 = 0.46. Btw Warum muss ich x [0], x [1] und x [2] anstelle von c3, b1, b2 im Code schreiben? Gibt es einen clevereren Weg mit Zwängen zB?

    One Solution collect form web for “Welche Variable wird durch scipy.optimize minimiert.minimieren / Wie funktioniert das?”

    Sie haben drei transzendenten Gleichungen für die 3 Variablen b1 , b2 und c3 . Was Sie tun müssen, ist, diese 3 Gleichungen für Ihre Variablen zu lösen. Da die Gleichungen transzendent sind, ist es möglich, dass es keine Lösung gibt, eine Lösung oder viele Lösungen. Das Lösen mit Mathematica gibt:

     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 

    Also gibt es eigentlich nur eine Lösung. Jetzt könntest du auch root benutzen, um diese Lösung deines Gleichungssystems numerisch zu finden:

     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)) 

    Gibt:

     b1 = 0.214076256767, b2 = 2.85985240432, c3 = 0.446302998585 

    Was Sie mit minimize getan haben minimize ist die Minimierung der Summe der drei Gleichungen, die nicht gleichbedeutend ist mit "minimieren c3 in (der) Satz von Gleichungen".

    minimize ist nicht für was du willst. 'Minimieren' tut etwas wie Minimieren finden Sie das x, das f(x) = x**2 minimiert. Die Antwort wäre offensichtlich 'x = 0'.

    Du musst 'x [0]' wegen der Schnittstelle von 'minimieren' schreiben. Die Funktion erwartet einfach, dass Sie die Parameter, die Sie in Vektorform minimieren möchten, geben.

    Python ist die beste Programmiersprache der Welt.