솔버에게에만 제한된 지역에 뿌리를두고 기능을 제공하는 것이이 문제를 해결하려면 (특히 좋은 그러나 희망 작동하지 않는) 옵션을 하나하고는 해결사가 보장하는 방식으로 계속 적절한 지역으로 밀려났습니다 (here과 같지만 다차원입니다).
하나가이 (직사각형 제약 적어도) 선형 함수의 경계 값부터 계속 된 constrainedFunction
을 구현하는 것입니다 달성하기 위해 할 수있는 무엇 :
import numpy as np
def constrainedFunction(x, f, lower, upper, minIncr=0.001):
x = np.asarray(x)
lower = np.asarray(lower)
upper = np.asarray(upper)
xBorder = np.where(x<lower, lower, x)
xBorder = np.where(x>upper, upper, xBorder)
fBorder = f(xBorder)
distFromBorder = (np.sum(np.where(x<lower, lower-x, 0.))
+np.sum(np.where(x>upper, x-upper, 0.)))
return (fBorder + (fBorder
+np.where(fBorder>0, minIncr, -minIncr))*distFromBorder)
이 기능을 전달할 수있는 x
값을 지정하고 계속 진행하려는 함수 f
과 모든 모양에서 상한 및 하한을 지정하는 x
과 같은 모양의 lower
및 upper
의 두 배열을 사용할 수 있습니다. 이제 원래 함수가 아닌이 함수를 해석기에 전달하여 근본을 찾을 수 있습니다.
경계의 가파른 점프는 국경에서 기호 변경에 대한 급격한 점프를 방지하기 위해 순간적으로 경계 값으로 사용됩니다. 제한된 영역 외부의 루트를 방지하기 위해 일부 작은 값이 양수/음수 경계 값에 더 해지고/빼집니다. 나는 이것이 이것을 처리하는 아주 좋은 방법이 아니라는 것에 동의하지만, 작동하는 것처럼 보인다.
다음은 두 가지 예입니다. 두 가지 모두에 대해 초기 추측은 구속 된 영역 외부에 있지만 구속 된 영역의 올바른 루트가 발견됩니다.구속 다차원 코사인 뿌리 찾기
[-2, -1] X [1, 2] 준다 :
from scipy import optimize as opt
opt.root(constrainedFunction, x0=np.zeros(2),
args=(np.cos, np.asarray([-2., 1.]), np.asarray([-1, 2.])))
준다 :이 또한 기능 작동
fjac: array([[ -9.99999975e-01, 2.22992740e-04],
[ 2.22992740e-04, 9.99999975e-01]])
fun: array([ 6.12323400e-17, 6.12323400e-17])
message: 'The solution converged.'
nfev: 11
qtf: array([ -2.50050470e-10, -1.98160617e-11])
r: array([-1.00281376, 0.03518108, -0.9971942 ])
status: 1
success: True
x: array([-1.57079633, 1.57079633])
그런 대각선되지 않습니다
def f(x):
return np.asarray([0., np.cos(x.sum())])
opt.root(constrainedFunction, x0=np.zeros(2),
args=(f, np.asarray([-2., 2.]), np.asarray([-1, 4.])))
을 제공합니다
이미 떨어져 교차 한 수있는 무언가를 제안의 위험에서
fjac: array([[ 0.00254922, 0.99999675],
[-0.99999675, 0.00254922]])
fun: array([ 0.00000000e+00, 6.12323400e-17])
message: 'The solution converged.'
nfev: 11
qtf: array([ 1.63189544e-11, 4.16007911e-14])
r: array([-0.75738638, -0.99212138, -0.00246647])
status: 1
success: True
x: array([-1.65863336, 3.22942968])
어쩌면 내가 틀렸지 만 게시 한 링크에서 '스칼라'바로 아래에서 '다차원'을 찾을 수 있습니다. 찾고있는 것 : https://docs.scipy.org/doc/scipy/reference /optimize.html#multidimensional –
@JanZeiseweis는 지금까지 내가 볼 수있는대로 나열된 다차원 솔버의에 제약을를 사용하는 옵션이 없습니다. Wolpertinger가 물어 보는 것 같아요. – jotasi
@jotasi 사실 그건 완전히 잊어 버렸습니다. 원칙적으로 감사 –