¥DÃD3. ³Ì¨Î¤Æºtºâ¡]Optimization¡^ ¨D·¥È «e±ªº¥DÃD¬O¸Ñº¡¨¬¤@¶¥¾É¨ç¼Æªº®Ú¡A¦]¦¹¡A§ÚÌ¥²¶·¥ý·L¤À¨D¥X¾É¨ç¼Æ¡C¦ý¬O¡A³Ì²³æªº¤èªk¬Oª½±µ¹ï¥Ø¼Ð¨ç¼Æ¨D¸Ñ¡G¦P®É¸Ñ¥X¥Ø¼Ð·¥È©MÁ{¬ÉÈ¡C Python§¹¦¨³o¥ó¨Æ¦³sympy©Mscipy¡Aµ§ªÌı±osympy»Ýn«Å§iªº°Ñ¼Æ¤Ó¦h¡A¤×¨ä¬O¦b±a¨î¦¡®É¡C©Ò¥H§Ų́ϥμҲÕscipy¤ºªº¨ç¼Æoptimize()©Mminimize()¡APythonµ{¦¡½Xªº¨BÆJ¸Ñ»¡¦p¤U¡C
5.3-1 ³æÅܼÆ
§ÚÌ¥ý¬Ý¥»³¹½d¨Ò1ªºÂ²³æ¤èµ{¦¡¡A¦p¤U¡G ²Ä1¨B¡G©w¸q¨ç¼Æ from scipy import optimize def f(x, sign=-1): return sign*(2*x**3+3*x**2-12*x-7)
¨â¦æ´NOK¡A¬Û·í²©ö¡C«Ý·|§Ú̦A¸ÑÄÀsignªº·N¸q¡C±µ¤U¨Ó°õ¦æ¨D·¥È¡G
²Ä2¨B¡G¨D¸Ñ»Pµ²ªG Result1 = optimize. minimize_scalar(f) Result1.x Result1.fun f(Result1.x)
optimize. minimize_scalar()¬O¨D¸Ñ¨ç¼Æ¡CResult1¤º¦³³\¦hª«¥ó¡A¥Dn¦³¤TÓ¡G (1) Result1.x: ¸Ñ¥XªºxÈ¡C (2) Result1.fun: ¸Ñ¥Xªº·¥¤pÈ¡A¥i¥H©Mf(Result1.x)¹ï·Ó¬O§_¤@¼Ë¡C (3) Result1.success: ¦^¶Ç¨D¸Ñ¬O§_¦¨¥\¡]True/False¡^¡C §Ú̬ݬݦC¦L¦b¿Ã¹õªºµ²ªG¡A¦p¤U¡G Result1.x Out[2]: 1.0
Result1.fun Out[3]: -14.0
f(Result1.x) Out[4]: -14.0
§Ú̦^¥h¬Ý½d¨Ò1ªº¹Ï§Î¡A¥i¯àªºÁ{¬ÉȦ³¨âÓ¡A±q¹Ï§Î¬Ýªº¥X¨Ó¡A§Ú̸ѥXªº¥u¬O·¥¤pÈ¡]1, -14¡^¡C¨º¥t¤@·¥¤jȪº¸Ñ©O¡H®Ú¾Úscipy»¡©ú¤å¥ó¡A¶·§â¨ç¼Æ¨útÈ ¡A³o¤]¬O§Ú̬°¤°»ò¼g¨ç¼Æ®É¡An¼W¥[¤@Ó°Ñ¼Æ sign¡A¦]¬°³o¼Ë¤ñ¸û¤è«K¡A§PÂ_·¥¤jȮɡA¥i¥H¦p¤U³o¼Ë³B²z¡G ²Ä1¨B¡G©w¸q¨ç¼Æ def f(x, sign = -1): return sign*(2*x**3+3*x**2-12*x-7)
²Ä2¨B¡G¨D¸Ñ»Pµ²ªG Result2 = optimize.minimize_scalar(f)
¿Ã¹õªºµ²ªG¦p¤U¡]»Ýª`·N·¥È¶·¥[t¸¹¡^ Result2.x Out[5]: -1.999999999777818
-Result2.fun Out[6]: 13.0
-f(Result2.x) Out[7]: 13.0
½d¨Ò5 ¨ç¼Æf(x)=x4-x3¬Û¹ï·¥¤pÈ ²Ä1¨B¡G©w¸q¨ç¼Æ def f(x,sign=1): return sign*(x**4-x**3)
²Ä2¨B¡G¨D¸Ñ»Pµ²ªG Result3 = optimize.minimize_scalar(f)
¿Ã¹õªºµ²ªG¦p¤U Result3.x Out[9]: 0.7500000000447832
Result3.fun Out[10]: -0.10546875
f(Result3.x) Out[11]: -0.10546875
5.3-2 ¦hÅÜ¼Æ ¦A¨Ó´N¬O¤£±a¨î±ø¥óªº¦hÅܼƨç¼Æ¡A¥»½d³ò½d¨Òªº¨ç¼Æ ¬Û¹ï·¥¤pÈ¡A«h¡G
²Ä1¨B¡G©w¸q¨ç¼Æ import numpy as np from scipy.optimize import minimize def f(x, sign=1): x1 = x[0] x2 = x[1] return sign*(x1**3-4*x1*x2 +2*x2**2) ²Ä2¨B¡G¨D¸Ñ»Pµ²ªG x0=[1,1] Result4 = minimize(f, x0)
ÂùÅܼƥH¤Wªº¼ÆȨD¸Ñºtºâ¤ñ¸û½ÆÂø¡A§Ų́ϥΪº¨ç¼Æ¬Ominimize()¡A¦pªG¥Î¤W±ªºoptimize.minimize_scalar()°õ¦æ·|¥¢±Ñ¡Cx0=[1,1]¬O°_©lÈ¡]initial values¡^¡C
¿Ã¹õªºµ²ªG¦p¤U¡G Result4.x Out[13]: array¡][1.33333404, 1.3333353 ]¡^
Result4.fun Out[14]: -1.185185185181036
f(Result4.x) Out[15]: -1.185185185181036
¦]¬°¬O¼Æȵ²ªG¡A®Ñ¤W¤â¸ÑªºÁ{¬ÉȬO4/3¡A¹q¸£«hºâ¥X1.3333¡C¬Û¹ï·¥¤pÈ«h¬O -1.185¡C
¦¹ÃDÁÙ¦³¤@¸Ñ¡A¡]0,0¡^¬O¾bÂI¡A¦pªG³]©wx0=[0,0]¡A´N·|±a¥X0ªº·¥È¡C¦]¬°¾bÂI§PÂ_ªºµ{¦¡°µªk»Ýn½á¤©§ó¦hªº±ø¥ó¡A¤£¬O¥»®Ñ²[»\¡A¤]¤£¬O°Ó¾Ç°|·L¿n¤À¥DÃD¡A§Ṳ́jPª¾¹D¥Ø«e¾Ç²ßªºª¬ªp§Y¥i¡C¦pªG·Q¬D¾ÔPython µ{¦¡¡A§â¥Ø«e©Ò¾Ç¹Lªº¤èªk¦ê°_¨Ó¡A¥i¥H´`¥H¤U¨BÆJ¡G ¨BÆJ 1. ¨Ï¥Îdiff()¨ç¼Æ¸Ñ¤@¶¥°¾·L¤À¡A¨D¨ú¥i¯àªºÁ{¬ÉÈ ¨BÆJ 2. ¨D¤G¶¥°¾·L¤À ¨BÆJ 3. °Ñ¦Ò¥DÃD¤@ªº¤G¤¸¤@¦¸¤èµ{¦¡¨D¸Ñ§PÂ_ªº·Ç«h¡]Delta¡^¡A©w¸q²Ä¤T³¹ªºƒ´¨Ó§PÂ_½Ö¬O¾bÂI¡A½ÖµL¸Ñ¡C ³Ì«á. §â¥i¯àªºÁ{¬Éȳ]¬°°_©lÈ¡A¨D¸Ñ¡C
³o¼Ëªº¥|¨BÆJ¨ä¹ê¬O¤@Óµ{¦¡°V½mªº¨å«¬°ò¦¡A¦³µ{¦¡¿³½ìªº¦P¾Ç¥i¥H¥Î¦b¥»½d³ò½d¨Ò·í§@½m²ß¡A¬°¤FÁקK·L¿n¤À¾Ç²ßªá¤Ó¦h®É¶¡Á¿³oÓ¡A§ÚÌ´N¨ì¦¹¬°¤î¡C
½m²ß 1. ¥ô¿ï¥»½d³ò½d¨ÒÃD¡A¥H®Ñ¥»¸Ñ¥XªºÁ{¬ÉȪþªñ¥ô¨ú¼Æ¦r·í§@°_©lÈ¡A¼gµ{¦¡¨D¸Ñ·¥È¡A¨Ã©M®Ñ¥»¤ñ¹ï¡C
5.3-3 ¦hÅܼƱa¨î¦¡
³Ì«á´N¬O±a¨î±ø¥óªº·¥È¡A§ÚÌ¥H²Ä15°ó½Ò½d¨Ò1¨Ó»¡©ú Min. s.t. ²Ä1¨B¡G©w¸q¥Ø¼Ð¨ç¼Æ import numpy as np from scipy.optimize import minimize def f(x, sign=1): x1 = x[0] x2 = x[1] return sign*(x1+ 2*x2)
²Ä2¨B¡G©w¸q¨î±ø¥ó def constraint1(x, sign=1): return sign*(x[0]*x[1]- 5000)
²Ä3¨B¡G³]©w¨D¸Ñ°Ñ¼Æ x0=[10,10] # °_©lÈ¡A b1 = (0, np.inf) # °Ñ¼Æ±ø¥óxɬ¡A¤W¬Éµ¹¤©¥¿µL¤j¡Anp.inf´N¬O„V b2 = (0, np.inf) # °Ñ¼Æ±ø¥óyɬ¡A¤W¬Éµ¹¤©¥¿µL¤j¡Anp.inf´N¬O„V bnds= (b1,b2) # Ãä¬É±ø¥ó¦V¶q con1 = {'type': 'ineq', 'fun': constraint1} #§â¨î¶°©w¸q¦¨¦r¨å cons = [con1] #§âcon1°µ¦¨¦ê¦C ¡]¸U¤@¦³¦hÓ±ø¥ó®É¡A¥i¥H¥]¦b¤@°_¡^
²Ä4¨B¡G¨D¸Ñ»Pµ²ªG Result5 = minimize(f, x0,bounds=bnds,constraints=cons) ¿Ã¹õªºµ²ªG¦p¤U
Result5.x Out[17]: array([100.00691556, 49.99654246])
Result5.fun Out[18]: 200.0000004780455
f(Result5.x) Out[19]: 200.0000004780455
¥i¹ï·Ó¼ÆȪºµ²ªG©M²Ä15°ó½Ò¥N¼Æªºµ²ªG¡C
±µ¤U¨Ó§Ú̬ݡu¤TÅܼơA¨â±ø¨î¦¡¡v¡A¦p²Ä15°ó½Ò½d¨Ò3¡C³oÓ½d¨Ò¨¬¥H°µ«Ü¦hªº±À¼s Min. ¡@s.t. ¡@ ²Ä1¨B¡G©w¸q¥Ø¼Ð¨ç¼Æ import numpy as np from scipy.optimize import minimize def f(x, sign=1): x1 = x[0] x2 = x[1] x3 = x[2] return sign*(x1**2+ x2**2+x3**2)
²Ä2¨B¡G©w¸q¨î±ø¥ó def constraint1(x, sign=1): return sign*(x[0]+x[1]-3) def constraint2(x, sign=1): return sign*(x[0]+x[2]- 5)
²Ä3¨B¡G³]©w¨D¸Ñ°Ñ¼Æ¡]°Ñ¼Æ¨S¦³bounds¡A¬G¤£»Ý©w¸q¦p«e´£ªºb1,b2¡^ x0=[1,1,1] con1 = {'type': 'ineq', 'fun': constraint1} con2 = {'type': 'ineq', 'fun': constraint2} cons = [con1, con2]
²Ä4¨B¡G¨D¸Ñ»Pµ²ªG Result6 = minimize(f,x0,constraints=cons)
¿Ã¹õªºµ²ªG¦p¤U Result6 = minimize(f,x0,constraints=cons)
Result6.x Out[21]: array([2.6666667, 0.3333333, 2.3333333])
Result6.fun Out[22]: 12.666666666666735
f(Result6.x) Out[23]: 12.666666666666735
¥i¥H½T»{¼Æȵ²ªG©M²Ä15°ó½Òªº¤À¦¡¡A¬O¤@¼Ëªº¡C³o¼Ë¥»½d³ò©Ò¦³ªº°ÝÃD¡A§Ú̳£¥i¥H³B²z¤F¡C
½m²ß 1. קï¤W±µ{¦¡¡A¨D¸Ñ¥»½d³ò½d¨Ò©M²ßÃD¡A©Mµª®×½T»{µ²ªG¡C
|