簡體   English   中英

使用scipy.optimize.minimize()進行約束優化的問題

[英]Problems with constrained optimization using scipy.optimize.minimize()

我正在嘗試使用scipy.optimize.minimize()進行約束優化。 如果我們稱最小化問題為s ,則我要實現的約束條件是s[0] = 0s[-1] = 1 這是一個重現我得到的錯誤的最小腳本:

import numpy as np
from scipy.optimize import minimize

def potential( x, y ):

  x2 = x * x
  x4 = x2 * x2
  y2 = y * y
  y5 = ( y - 5./3. ) * ( y - 5./3. )
  y3 = ( y - 1./3. ) * ( y - 1./3. )
  y34 = y3 * y3
  x_1 = ( x - 1. ) * ( x - 1. )
  x1 = ( x + 1. ) * ( x + 1. )

  pot = 5. * np.exp( -x2 - y2 ) - 3. * np.exp( - x2 - y5 ) - 5. * np.exp( - x_1 - y2 ) - 5. * np.exp( - x1 - y2 ) + 0.2 * x4 + 0.2 * y34

  return pot

def functional( q, x_new, y_new ):
  I = 0
  beta = 1./6.67
  dl = 0.2
  dl2 = dl**2

  for k in range(1, len(q) - 1):
    ngradU = ( potential(x_new[k+1], y_new[k+1]) - potential(x_new[k], y_new[k]) ) / dl
    I += ( beta/dl2 * ( q[k+1] + q[k-1] - 2. * q[k] ) + beta/2. * (q[k+1] - q[k]) * ngradU )**2

  return I

def delta(i, k):
  if( i == k ):
    return 1.
  else:
    return 0.

def derivative( q, x_new, y_new ):

  beta = 1./6.67
  dl = 0.2
  dl2 = dl**2

  der = np.zeros_like(q)

  for j in range(len(q)):
    for k in range(1, len(q) - 1):
        ngradU = ( potential(x_new[k+1], y_new[k+1]) - potential(x_new[k], y_new[k]) ) / dl
        deltas = beta/dl2 * ( delta(k+1, j) + delta(k-1,j) - 2. * delta(k,j) ) - beta/dl * ngradU * ( delta(k+1, j) - delta(k,j) )
        der[j] += ( beta/dl2 * ( q[k+1] + q[k-1] - 2. * q[k] ) + beta/2. * (q[k+1] - q[k]) * ngradU ) * deltas

  return der

### MAIN
x_new = [-0.75956243, -0.63528643, -0.49338262, -0.35764855, -0.23954228, -0.12408018, 0.02134918, 0.20379693, 0.32454737, 0.43119557, 0.54225072, 0.66211977, 0.78198882]
y_new = [0.55944712, 0.70475988, 0.83125047, 0.96420533, 1.11378898, 1.26572396, 1.38819039, 1.33494757, 1.18824942, 1.03070726, 0.87501396, 0.7275383, 0.57900219]
s = [ 0.07453653, 0.14188005, 0.21413291, 0.28632847, 0.35839168, 0.43770331, 0.51499522, 0.58833728, 0.66737105, 0.73637078, 0.80085735, 0.86481271, 0.92374577]

cons = ({'type': 'eq',
          'fun' : lambda x: x[0],
          'jac' : lambda x: x[0]},
        {'type': 'eq',
          'fun' : lambda x: x[-1],
          'jac' : lambda x: x[-1]})

res = minimize(functional, s, method='SLSQP', jac=derivative, constraints=cons, options={'disp': True}, args=(x_new, y_new))

錯誤如下:

ValueError:除串聯軸外的所有輸入數組維必須完全匹配

x_newy_news的長度完全匹配,所以我的猜測是我在約束方面做錯了。 的確,當我使用具有完全相同參數的method='CG'時(不包括約束),計算可以完美運行。

謝謝您的幫助!

該缺陷是你的jaccons

 'jac' : lambda x: x[0]

您的x是一個數組,一個數組的jac應該產生一個數組。 您可以通過刪除此jac解決它,或通過正確的尺寸來解決它。

'CG'方法無法處理約束,因此您的cons被忽略,這就是為什么您未在'CG'中發現此錯誤的原因。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM