2017-04-09 18 views
2

私は非線形制約を持つ非線形関数を持っています。私はそれを最適化したいと思います。私はscipy.optimizeを使って非線形制約を定義する方法を知らない。これまでのコードは次のようになりました。非線形制約付きのscipy.optimize

from math import cos, atan 
import numpy as np 
from scipy.optimize import minimize 
import sympy as sy 

def f(x): 
    return 0.1*x*y 

def ineq_constraint(x): 
    x**2 + y**2 - (5+2.2*sy.cos(10*sy.atan(x/y)))**2 
    return x,y 

con = {'type': 'ineq', 'fun': ineq_constraint} 
minimize(f,x0,method='SLSQP',constraints=con) 

答えて

2

コードには少し問題がありました。以下のようになります

from math import cos, atan 
import numpy as np 
from scipy.optimize import minimize 


def f(x): 
    return 0.1 * x[0] * x[1] 

def ineq_constraint(x): 
    return x[0]**2 + x[1]**2 - (5. + 2.2 * cos(10 * atan(x[0]/x[1])))**2 


con = {'type': 'ineq', 'fun': ineq_constraint} 
x0 = [1, 1] 
res = minimize(f, x0, method='SLSQP', constraints=con) 

res:ここで修正版(以下の説明が)ある

 fun: 0.37229877398896682 
    jac: array([ 0.16372866, 0.22738743, 0.  ]) 
message: 'Optimization terminated successfully.' 
    nfev: 96 
    nit: 22 
    njev: 22 
    status: 0 
success: True 
     x: array([ 2.27385837, 1.63729975]) 

一つの問題はxyが自分の関数で定義されていなかったということでした、私はx[0]によってそれらを交換し、 x[1];また、sympyを使用して制約を定義する必要はなく、xyではなく、実際の制約を返す必要がありました。

+1

ありがとうございました! – user2702405

+1

既に完了! :) – user2702405

関連する問題