6

Matlab과 Python에서 'm'비선형 방정식을 풀어내는 문학에 게재 된 알고리즘을 테스트 해 왔습니다. 비선형 방정식 집합에는 복소수를 포함하는 입력 변수가 포함되므로 결과 솔루션도 복잡해야합니다. 지금, 나는 다음 코드 줄을 사용하여 matlab에 꽤 좋은 결과를 얻을 수 있었다 : h와 g는 각각 복잡한 행렬 및 벡터입니다파이썬에서 비선형 방정식 집합으로부터 복잡한 뿌리 찾기

lambdas0 = ones(1,m)*1e-5; 
options = optimset('Algorithm','levenberg-marquardt',... 
'MaxFunEvals',1000000,'MaxIter',10000,'TolX',1e-20,... 
'TolFun',1e-20); 

Eq = @(lambda)maxentfun(lambda,m,h,g); 
[lambdasf] = fsolve(Eq,lambdas0,options); 

. 이 솔루션은 광범위한 초기 값에 대해 매우 잘 수렴합니다.

저는 파이썬에서 이러한 결과를 모방하려고했지만 거의 성공하지 못했습니다. 수치 해석기는 많이 다르게 설정되어있는 것 같고 'levenburg-marquardt'알고리즘은 함수 루트 아래에 있습니다. 파이썬에서이 알고리즘은 복잡한 뿌리를 처리 할 수없고 나는 다음 줄을 실행하면

lambdas0 = np.ones(m)*1e-5 

sol = root(maxentfun, lambdas0, args = (m,h,g), method='lm', tol = 1e-20, options = {'maxiter':10000, 'xtol':1e-20}) 

lambdasf = sol.x 

나는 다음과 같은 오류 얻을 :

minpack.error: Result from function call is not a proper array of floats. 

내가 다른 알고리즘의 일부를 사용하여 시도, 등을 ' broyden2 '와'anderson '이지만 Matlab보다 훨씬 열등하며 초기 조건을 가지고 놀고 난 후에 만 ​​좋은 결과를 준다. 'fsolve'함수는 복잡한 변수도 처리 할 수 ​​없습니다.

내가 잘못 적용하고있는 부분이 있는지, 누군가 파이썬에서 복잡한 비선형 방정식을 올바르게 풀 수있는 방법에 대한 아이디어가 있는지 궁금합니다. 내가 실수 부와 허수 부분의 배열로 제 기능을 다시하려고 이러한 유형의 문제가 발생하는 경우

당신에게

답변

5

대단히 감사합니다. 예를 들어, f 경우 복잡한 입력 배열 x 소요 함수이다

from numpy import * 
def f(x): 
    # Takes a complex-valued vector of size 2 and outputs a complex-valued vector of size 2 
    return [x[0]-3*x[1]+1j+2, x[0]+x[1]] # <-- for example 

def real_f(x1): 
    # converts a real-valued vector of size 4 to a complex-valued vector of size 2 
    # outputs a real-valued vector of size 4 
    x = [x1[0]+1j*x1[1],x1[2]+1j*x1[3]] 
    actual_f = f(x) 
    return [real(actual_f[0]),imag(actual_f[0]),real(actual_f[1]),imag(actual_f[1])] 

새로운 함수, real_ffsolve 사용될 수있다 (예를 들어 x는 간략화를 위해 2 사이즈 갖는다) 함수의 실수 부 및 허수 부를 입력 인수의 실수 부와 허수 부를 독립적으로 취급하면서 동시에 해결된다.

관련 문제