2015-01-28 3 views
-1

fsolve을 사용하여 3 차 방정식의 근원을 찾으려고합니다. 이것은 내 코드입니다 :방정식의 근원을 찾아내는 것은 초기 추측을 수치로 반환합니다.

from scipy import * 
from scipy.optimize import fsolve 
import matplotlib.pyplot as plt 
import numpy as np 

#These are all parameters 
g = 5.61 
gamma = 6.45 
kappa = 6.45 
J = 6.45 
rs = 10.0       
m = 5.0*10**(-11) 
wm = 2*3.14*23.4 
r2 = np.linspace(0, 0.02, 1000) 
deltaW = 0      

A = 1j*g**2*(kappa + 1j*deltaW)*r2*r2/(m*wm**2) 
B = J**2 + (1j*deltaW - gamma)*(1j*deltaW + kappa) 
C = A + B 
D = abs(C)*r2 - J*np.sqrt(2*kappa)*rs 

def func(x): 
     D = abs(C)*r2 - J*np.sqrt(2*kappa)*rs 
     return D 

x0 = fsolve(func, 0.0) 
print x0 
plt.plot(r2, D) 
plt.show() 

플롯에서 D를 0으로 만드는 적어도 하나의 r2가 있음을 알 수 있습니다. 그러나 fsolve에서 얻은 반환 값 x0은 항상 내가 설정 한 추측 값입니다. 아무도 왜 이런 일이 일어나고 어떻게 해결할 수 있는지 말해 줄 수 있습니까?

+0

정말 미안 그런 바보 같은 질문에 대해. – epx

답변

0

함수가 전혀없는 함수 fsolve에 전달 중입니다. 입력 값이 x 인 경우 아무 것도 수행하지 않습니다. 그러나 fsolve은 일련의 값을 테스트하고 매번 해당 테스트 값을 사용하여 함수 호출에서 반환 값을 확인하기 때문에이를 필요로합니다. 귀하의 경우, func(x)은 결코 변하지 않는다, 그래서 지난 10 반복의 개선에 의해 측정 된 fsolve는 반복 좋은 진전되지

의 오류 메시지와 함께 중지됩니다.

fsolve으로 전화하면 full_output=True을 추가하면 해당 메시지가 표시됩니다. 그것을 해결하기

이 같은 함수를 정의

def func(x): 
    A = 1j*g**2*(kappa + 1j*deltaW)*x*x/(m*wm**2) 
    B = J**2 + (1j*deltaW - gamma)*(1j*deltaW + kappa) 
    C = A + B 
    D = abs(C)*x - J*np.sqrt(2*kappa)*rs 
    return D