{"id":117,"date":"2019-01-03T23:18:02","date_gmt":"2019-01-03T23:18:02","guid":{"rendered":"http:\/\/gantovnik.com\/bio-tips\/?p=117"},"modified":"2024-07-14T19:33:07","modified_gmt":"2024-07-15T02:33:07","slug":"optimization-with-contraints","status":"publish","type":"post","link":"https:\/\/gantovnik.com\/bio-tips\/2019\/01\/optimization-with-contraints\/","title":{"rendered":"#22: Optimization with constraints using SciPy in python"},"content":{"rendered":"<p><a href=\"https:\/\/gantovnik.com\/bio-tips\/2019\/01\/optimization-with-contraints\/example22\/\" rel=\"attachment wp-att-118\"><img data-recalc-dims=\"1\" decoding=\"async\" class=\"alignnone size-full wp-image-118\" src=\"https:\/\/i0.wp.com\/gantovnik.com\/bio-tips\/wp-content\/uploads\/2019\/01\/example22.png?resize=600%2C400&#038;ssl=1\" alt=\"\" width=\"600\" height=\"400\" srcset=\"https:\/\/i0.wp.com\/gantovnik.com\/bio-tips\/wp-content\/uploads\/2019\/01\/example22.png?w=600&amp;ssl=1 600w, https:\/\/i0.wp.com\/gantovnik.com\/bio-tips\/wp-content\/uploads\/2019\/01\/example22.png?resize=300%2C200&amp;ssl=1 300w\" sizes=\"(max-width: 600px) 100vw, 600px\" \/><\/a><\/p>\n<pre class=\"brush: python; title: ; notranslate\" title=\"\">\nimport os\nimport matplotlib.pyplot as plt\nimport numpy as np\nfrom scipy.optimize import minimize\nos.chdir(r&amp;#039;D:\\data\\scripts\\web1\\ex22&amp;#039;)\nos.getcwd()\ndef f(X):\n    return (X&#x5B;0]-1)&lt;strong&gt;2 + (X&#x5B;1]-1)&lt;\/strong&gt;2\n\ndef g(X):\n    return X&#x5B;1]-1.75-(X&#x5B;0]-0.75)**4\n\ndef func_X_Y_to_XY(f, X, Y):\n    s = np.shape(X)\n    return f(np.vstack(&#x5B;X.ravel(), Y.ravel()])).reshape(*s)\n\nx_opt=minimize(f,(0,0),method=&amp;#039;BFGS&amp;#039;).x\nprint(x_opt)\nconstraints = &#x5B;dict(type=&amp;#039;ineq&amp;#039;, fun=g)]\nx_cons_opt = minimize(f, (0, 0), method=&amp;#039;SLSQP&amp;#039;, constraints=constraints).x \nprint(x_cons_opt)\nx_cons_opt = minimize(f, (0, 0), method=&amp;#039;COBYLA&amp;#039;, constraints=constraints).x\nprint(x_cons_opt)\nfig, ax = plt.subplots(figsize=(6, 4))\nx_ = y_ = np.linspace(-1, 3, 100)\nX, Y = np.meshgrid(x_, y_)\nc = ax. Contour(X, Y, func_X_Y_to_XY(f, X, Y), 50)\nax. Plot(x_opt&#x5B;0], x_opt&#x5B;1], &amp;#039;b&lt;em&gt;&amp;#039;, markersize=15)\nax. Plot(x_, 1.75 + (x_-0.75)&lt;strong&gt;4, &amp;#039;k-&amp;#039;, markersize=15)\nax.fill_between(x_, 1.75 + (x_-0.75)&lt;\/strong&gt;4, 3, color=&amp;quot;grey&amp;quot;)\nax.plot(x_cons_opt&#x5B;0], x_cons_opt&#x5B;1], &amp;#039;r&lt;\/em&gt;&amp;#039;, markersize=15)\nax.set_ylim(-1, 3)\nax.set_xlabel(r&amp;quot;$x_0$&amp;quot;, fontsize=18)\nax.set_ylabel(r&amp;quot;$x_1$&amp;quot;, fontsize=18)\nax.set_title(&amp;quot;Optimization with constraints&amp;quot;)\nplt.colorbar(c, ax=ax)\nfig.tight_layout()\nplt.savefig(&amp;quot;example22.png&amp;quot;, dpi=100)\nplt.show()\nplt.close()\n\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>import os import matplotlib.pyplot as plt import numpy as np from scipy.optimize import minimize os.chdir(r&amp;#039;D:\\data\\scripts\\web1\\ex22&amp;#039;) os.getcwd() def f(X): return (X&#x5B;0]-1)&lt;strong&gt;2 + (X&#x5B;1]-1)&lt;\/strong&gt;2 def g(X): return X&#x5B;1]-1.75-(X&#x5B;0]-0.75)**4 def func_X_Y_to_XY(f, X, Y): s = np.shape(X) return f(np.vstack(&#x5B;X.ravel(), Y.ravel()])).reshape(*s) x_opt=minimize(f,(0,0),method=&amp;#039;BFGS&amp;#039;).x print(x_opt) constraints = &#x5B;dict(type=&amp;#039;ineq&amp;#039;, fun=g)] x_cons_opt = minimize(f, (0, 0), method=&amp;#039;SLSQP&amp;#039;, constraints=constraints).x print(x_cons_opt) x_cons_opt = minimize(f, (0, 0), [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"nf_dc_page":"","_et_pb_use_builder":"","_et_pb_old_content":"","_et_gb_content_width":"","_lmt_disableupdate":"yes","_lmt_disable":"","jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[9,2,71],"tags":[25,72],"class_list":["post-117","post","type-post","status-publish","format-standard","hentry","category-optimization","category-python","category-scipy","tag-optimization","tag-scipy"],"modified_by":"gantovnik","jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p8bH0k-1T","jetpack_likes_enabled":true,"jetpack-related-posts":[{"id":495,"url":"https:\/\/gantovnik.com\/bio-tips\/2020\/05\/optimization-with-constraints\/","url_meta":{"origin":117,"position":0},"title":"#72 Optimization with constraints using scipy in python","author":"gantovnik","date":"2020-05-03","format":false,"excerpt":"[code language=\"python\"] import os from scipy.optimize import minimize import matplotlib.pyplot as plt import numpy as np os.chdir(r'D:\\projects\\wordpress\\ex72') os.getcwd() def f(X): x, y = X return (x - 1)2 + (y - 1)2 def func_X_Y_to_XY(f, X, Y): #Wrapper for f(X, Y) -> f([X, Y]) s = np.shape(X) return f(np.vstack([X.ravel(), Y.ravel()])).reshape(*s) x_opt\u2026","rel":"","context":"In &quot;optimization&quot;","block_context":{"text":"optimization","link":"https:\/\/gantovnik.com\/bio-tips\/category\/optimization\/"},"img":{"alt_text":"ex72","src":"https:\/\/i0.wp.com\/gantovnik.com\/bio-tips\/wp-content\/uploads\/2020\/05\/ex72.png?resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/gantovnik.com\/bio-tips\/wp-content\/uploads\/2020\/05\/ex72.png?resize=350%2C200 1x, https:\/\/i0.wp.com\/gantovnik.com\/bio-tips\/wp-content\/uploads\/2020\/05\/ex72.png?resize=525%2C300 1.5x"},"classes":[]},{"id":845,"url":"https:\/\/gantovnik.com\/bio-tips\/2021\/01\/149-optimization-in-python\/","url_meta":{"origin":117,"position":1},"title":"#149 Optimization in python","author":"gantovnik","date":"2021-01-24","format":false,"excerpt":"#149 Optimization in python [code language=\"python\"] import os import numpy as np from scipy.optimize import minimize os.chdir(r'D:\\projects\\wordpress\\ex149') os.getcwd() def obj(x): return (1-x[0])**2 + 100*(x[1]-x[0]**2)**2 def con(x): g=np.zeros(2) g[0]=1-x[0]**2-x[1]**2 g[1]=5-x[0]-3*x[1] return g x0=[5.0,5.0] constraints = {'type': 'ineq','fun': con} options={'disp':True} res = minimize(obj,x0,constraints=constraints,options=options) print('x =',res.x) print('f =',res.fun) print(res.success) [\/code] Output: [code language=\"python\"]\u2026","rel":"","context":"In &quot;optimization&quot;","block_context":{"text":"optimization","link":"https:\/\/gantovnik.com\/bio-tips\/category\/optimization\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":847,"url":"https:\/\/gantovnik.com\/bio-tips\/2021\/01\/150-optimization-with-a-module-in-python\/","url_meta":{"origin":117,"position":2},"title":"#150 Optimization with a module in python","author":"gantovnik","date":"2021-01-24","format":false,"excerpt":"#150 Optimization with a module in python ex150.py [code language=\"python\"] import os import numpy as np from scipy.optimize import minimize, Bounds from structure import structure os.chdir(r'D:\\projects\\wordpress\\ex150') os.getcwd() def runoptimization(params,stressmax): objhist=[] def objcon(x): mass,stress=structure(x,params) f=mass g=stressmax-stress objhist.append(mass) return f,g xlast=[] flast=[] glast=[] def obj(x): nonlocal xlast,flast,glast if not np.array_equal(x,xlast): flast,glast =\u2026","rel":"","context":"In &quot;optimization&quot;","block_context":{"text":"optimization","link":"https:\/\/gantovnik.com\/bio-tips\/category\/optimization\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/gantovnik.com\/bio-tips\/wp-content\/uploads\/2021\/01\/ex150-300x200.png?resize=350%2C200","width":350,"height":200},"classes":[]},{"id":1758,"url":"https:\/\/gantovnik.com\/bio-tips\/2023\/01\/335-solution-of-nonlinear-equation-using-brent-method-in-python\/","url_meta":{"origin":117,"position":3},"title":"#335 Solution of nonlinear equation by Brent&#8217;s method in python","author":"gantovnik","date":"2023-01-06","format":false,"excerpt":"Brent's method is a hybrid root-finding algorithm combining the bisection method, the secant method, and inverse quadratic interpolation. ex335.py [code language=\"python\"] import numpy as np import matplotlib.pyplot as plt import scipy.optimize as optimize def f(x): return 2*x - 1 + 2*np.cos(np.pi*x) x = np.linspace(0.0,2.0,201) y=f(x) plt.plot(x,y,label='$2x - 1 + 2\\\\cos(\\\\pi\u2026","rel":"","context":"In &quot;optimization&quot;","block_context":{"text":"optimization","link":"https:\/\/gantovnik.com\/bio-tips\/category\/optimization\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/gantovnik.com\/bio-tips\/wp-content\/uploads\/2023\/01\/ex335.png?resize=350%2C200&ssl=1","width":350,"height":200},"classes":[]},{"id":2634,"url":"https:\/\/gantovnik.com\/bio-tips\/2024\/07\/436-non-convex-univariate-function-optimization-using-brents-method-in-python\/","url_meta":{"origin":117,"position":4},"title":"#436 Non-convex univariate function optimization using Brent&#8217;s method in python","author":"gantovnik","date":"2024-07-18","format":false,"excerpt":"Brent\u2019s method is an optimization algorithm that combines a bisecting algorithm (Dekker\u2019s method) and inverse quadratic interpolation. It can be used for constrained and unconstrained univariate function optimization. The Brent-Dekker method is an extension of the bisection method. It is a root-finding algorithm that combines elements of the secant method\u2026","rel":"","context":"In &quot;optimization&quot;","block_context":{"text":"optimization","link":"https:\/\/gantovnik.com\/bio-tips\/category\/optimization\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/gantovnik.com\/bio-tips\/wp-content\/uploads\/2024\/07\/ex436.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/gantovnik.com\/bio-tips\/wp-content\/uploads\/2024\/07\/ex436.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/gantovnik.com\/bio-tips\/wp-content\/uploads\/2024\/07\/ex436.png?resize=525%2C300&ssl=1 1.5x"},"classes":[]},{"id":1123,"url":"https:\/\/gantovnik.com\/bio-tips\/2021\/11\/199-cubic-spline-interpolation-using-scipy\/","url_meta":{"origin":117,"position":5},"title":"#199 Cubic spline interpolation using scipy","author":"gantovnik","date":"2021-11-20","format":false,"excerpt":"[code language=\"python\"] # Cubic spline interpolation from scipy.interpolate import CubicSpline import numpy as np import matplotlib.pyplot as plt plt.style.use(\"seaborn-poster\") x = [0, 1, 2] y = [1, 3, 2] # use bc_type = \"natural\" adds the constraints f = CubicSpline(x, y, bc_type=\"natural\") x_new = np.linspace(0, 2, 100) y_new = f(x_new)\u2026","rel":"","context":"In &quot;python&quot;","block_context":{"text":"python","link":"https:\/\/gantovnik.com\/bio-tips\/category\/python\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/gantovnik.com\/bio-tips\/wp-content\/uploads\/2021\/11\/ex199-1.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/gantovnik.com\/bio-tips\/wp-content\/uploads\/2021\/11\/ex199-1.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/gantovnik.com\/bio-tips\/wp-content\/uploads\/2021\/11\/ex199-1.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/gantovnik.com\/bio-tips\/wp-content\/uploads\/2021\/11\/ex199-1.png?resize=700%2C400&ssl=1 2x"},"classes":[]}],"_links":{"self":[{"href":"https:\/\/gantovnik.com\/bio-tips\/wp-json\/wp\/v2\/posts\/117","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/gantovnik.com\/bio-tips\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/gantovnik.com\/bio-tips\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/gantovnik.com\/bio-tips\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/gantovnik.com\/bio-tips\/wp-json\/wp\/v2\/comments?post=117"}],"version-history":[{"count":5,"href":"https:\/\/gantovnik.com\/bio-tips\/wp-json\/wp\/v2\/posts\/117\/revisions"}],"predecessor-version":[{"id":2490,"href":"https:\/\/gantovnik.com\/bio-tips\/wp-json\/wp\/v2\/posts\/117\/revisions\/2490"}],"wp:attachment":[{"href":"https:\/\/gantovnik.com\/bio-tips\/wp-json\/wp\/v2\/media?parent=117"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/gantovnik.com\/bio-tips\/wp-json\/wp\/v2\/categories?post=117"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/gantovnik.com\/bio-tips\/wp-json\/wp\/v2\/tags?post=117"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}