2016-12-13 2 views
3

임 매우 좋지 않다 fsolve 나는 베셀 함수 내부 미지를 포함하는 방정식을 근절해야하고 코드는 다음과 같이 진행됩니다함수 호출의 결과가 부동 소수점 배열이 아닙니다. 파이썬으로

import scipy.special as sp 
import numpy as np 
import matplotlib.pyplot as plt 
from scipy.optimize import fsolve 
import math 


eff = 50-10j     
e = 2.25     
w = 4e9*2*np.pi   
a = 7.5e-6   
c = 3e8     
p = 0.0022/100.   
L = np.sqrt(np.pi*a**2/p) 
lc= 0.05     
largo=0.38     
ancho=0.34    
prof=2./1000.    
volm=largo*ancho*prof  
volc=np.pi*a**2*lc   
volct=volm*p    
n=volct/volc    
nh=n*1e-4/(largo*ancho) 


func = lambda ec : e - (np.pi*a**2/L**2)*(2*ec*(sp.j1((ec**0.5)*w*a/c)/((ec**0.5)*w*(a/c)*sp.j0((ec**0.5)*w*a/c))))/(((((ec**0.5)*w*a/c)**2)*(sp.j1((ec**0.5)*w*a/c))/(((ec**0.5)*w*(a/c)*sp.j0((ec**0.5)*w*a/c))*np.log(L/a)))-1) - eff 


# Solver 

ec_initial_guess = 0.1 
ec_solution = fsolve(func, ec_initial_guess) 


print "Solution for ec is = %f" % ec_solution 
print "when the value of the expression is %f" % func(ec_solution) 

나는 오류 얻을 :

--------------------------------------------------------------------------- 
TypeError         Traceback (most recent call last) 
TypeError: Cannot cast array data from dtype('complex128') to dtype('float64') according to the rule 'safe' 

--------------------------------------------------------------------------- 
error          Traceback (most recent call last) 
<ipython-input-13-a9b1acf35136> in <module>() 
    40 
    41 ec_initial_guess = 1 
---> 42 ec_solution = fsolve(func, ec_initial_guess) 
    43 
    44 

/home/feliperossik/anaconda2/lib/python2.7/site-packages/scipy/optimize/minpack.pyc in fsolve(func, x0, args, fprime, full_output, col_deriv, xtol, maxfev, band, epsfcn, factor, diag) 
    144    'diag': diag} 
    145 
--> 146  res = _root_hybr(func, x0, args, jac=fprime, **options) 
    147  if full_output: 
    148   x = res['x'] 

/home/feliperossik/anaconda2/lib/python2.7/site-packages/scipy/optimize/minpack.pyc in _root_hybr(func, x0, args, jac, col_deriv, xtol, maxfev, band, eps, factor, diag, **unknown_options) 
    222    maxfev = 200 * (n + 1) 
    223   retval = _minpack._hybrd(func, x0, args, 1, xtol, maxfev, 
--> 224         ml, mu, epsfcn, factor, diag) 
    225  else: 
    226   _check_func('fsolve', 'fprime', Dfun, x0, args, n, (n, n)) 

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

을 이것은 나의 첫 번째 질문입니다. Im은 eqution 포맷을 유감스럽게 생각합니다. 저는 라텍스에서 쓰는 것처럼 그것을 쓰는 법을 정말로 모릅니다.

도움을 주시면 감사하겠습니다. 미리 감사드립니다!

편집 다음 sp.j1 및 sp.j0는 베셀 fucntions

답변

2

fsolve() 유일한 기능입니다, 그리고 당신은 ec() 람다 함수의 정의에 사용 : 임 복잡한 생각하는 것은 바로 EDIT2 아니다 복소수

eff = 50-10j 
+0

오, 그럼 복잡한 값을 삽입해야하기 때문에 기능을 변경해야합니다! 추천이 있으십니까? 베셀 함수를 사용해야합니다! 대답 해 주셔서 감사합니다!! –

관련 문제