nsolve
에 약간의 문제가있어서 초기 추측을 제공하는 일부 기능에 대한 해결책을 찾기가 어려웠습니다. 나는 그때 수줍음/scipy 해결사를 시도하고 싶었어요. 여기 심피와 너피 솔버의 차이점
[0.0, -9.05567e-72, 9.42477, 3.14159]
from sympy import *
# Symbols
theta = Symbol('theta')
phi = Symbol('phi')
phi0 = Symbol('phi0')
H0 = Symbol('H0')
# Constants
phi0 = 60*pi.evalf()/180
a = 0.05
t = 100*1e-9
b = 0.05**2/(8*pi.evalf()*1e-7)
c = 0.001/(4*pi.evalf()*1e-7)
def m(theta,phi):
return Matrix([[sin(theta)*cos(phi),sin(theta)*cos(phi),cos(phi)]])
def h(phi0):
return Matrix([[cos(phi0),sin(phi0),0]])
def k(theta,phi,phi0):
return m(theta,phi).dot(h(phi0))
def F(theta,phi,phi0,H0):
return -(t*a*H0)*k(theta,phi,phi0)+b*t*(cos(theta)**2)+c*t*(sin(2*theta)**2)+t*sin(theta)**4*sin(2*phi)**2
def F_phi(theta,phi,phi0,H0):
return diff(F(theta,phi,phi0,H0),phi)
def G(phi):
return F_phi(theta,phi,phi0,H0).subs(theta,pi/2)
H0 = -0.03/(4*pi.evalf()*1e-7)
sol = []
for i in range(5):
x0=i*pi.evalf()/4
solution = float(nsolve(G(phi),x0))
sol.append(solution)
sol = list(set(sol)) # remove duplicate values
print sol
을 그리고이 같은 프로그램이지만 호환 기능 NumPy와 사용 :
from numpy import *
from scipy.optimize import fsolve
# Constants
phi0 = 60*pi/180
a = 0.05
t = 100*1e-9
b = 0.05**2/(8*pi*1e-7)
c = 0.001/(4*pi*1e-7)
def m(theta,phi):
return array([sin(theta)*cos(phi),sin(theta)*cos(phi),cos(phi)])
def h(phi0):
return array([cos(phi0),sin(phi0),0])
def k(theta,phi,phi0):
return dot(m(theta,phi).T,h(phi0))
def F(theta,phi,phi0,H0):
return -(t*a*H0)*k(theta,phi,phi0)+b*t*(cos(theta)**2)+c*t*(sin(2*theta)**2)+t*sin(theta)**4*sin(2*phi)**2
def F_phi(theta,phi,phi0,H0):
return diff(F(theta,phi,phi0,H0),phi)
def G(phi):
return F_phi(pi/2,phi,phi0,H0)
H0 = -0.03/(4*pi*1e-7)
sol = []
for i in range(5):
x0=array([i*pi/4]) # x0 as ndarray argument for fsolve
solution = float(fsolve(G,x0))
sol.append(solution)
sol = list(set(sol)) # remove duplicate values
print sol
을하지만이를 실행할 때 프로그램 :
Traceback (most recent call last):
File "Test4.py", line 27, in <module>
solution = float(fsolve(G,x0))
File "/usr/lib64/python2.7/site-packages/scipy/optimize/minpack.py", line 127, in fsolve
res = _root_hybr(func, x0, args, jac=fprime, **options)
File "/usr/lib64/python2.7/site-packages/scipy/optimize/minpack.py", line 224, in _root_hybr
raise errors[status][1](errors[status][0])
TypeError: Improper input parameters were entered.
나는 x0에 값 0을주고 두 번째 프로그램 (numpy 사용)은 숫자 값을 0에 가깝게 만들었지 만 pi/4에서 시작하여 오류 메시지를 표시합니다. 나는 수치스럽고 무언가를 놓쳤는가?
>> G(array([pi/4]))
array([], dtype=float64)
문제는 일치한다 : sympy.diff
이 유도체를 산출하는 반면
return diff(F(theta,phi,phi0,H0),phi)
numpy.diff
는, 어레이의 연속 된 요소 사이의 차이를 계산 빈 배열을 반환 G(array([pi/4]))
NumPy와 버전 함수에서
귀하의 문제에 대한 해결책을 제공하는 답변을 반드시 수락하십시오 (답변 옆의 체크 표시 사용). – btel