अजगर में समारोह की जड़ों ढूँढना

वोट
2

मैं एक समारोह scipy समारोह का उपयोग कर के लिए जड़ों की गणना करने के कोशिश कर रहा हूँ fsolve, लेकिन एक त्रुटि फ़्लैग करने रखता है:

TypeError: 'numpy.array' object is not callable

मुझे लगता है यह शायद एक समारोह के रूप समीकरण परिभाषित करने के लिए आसान है, लेकिन मैं कोई लाभ नहीं हुआ है कि कई बार कोशिश की है।

कोड:

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

# Constants
wavelength = 0.6328
ncore = 1.462420
nclad = 1.457420
a = 8.335

# Mode Order
l = 0

# Mode parameters
V = (2 * np.pi * a / wavelength) * np.sqrt(ncore**2 - nclad**2)
U = np.arange(0, V, 0.01)
W = np.sqrt(V**2-U**2)

func = U * scipy.special.jv(l+1, U) / scipy.special.jv(l, U) - W * scipy.special.kv(l+1, W) / scipy.special.kv(l, W)

from scipy.optimize import fsolve
x = fsolve(func,0)
print x

स्टैक ट्रेस:

Traceback (most recent call last):

  File <ipython-input-52-081a9cc9c0ea>, line 1, in <module>
    runfile('/home/luke/Documents/PythonPrograms/ModeSolver_StepIndex/ModeSolver_StepIndex.py', wdir='/home/luke/Documents/PythonPrograms/ModeSolver_StepIndex')

  File /usr/lib/python2.7/site-packages/spyderlib/widgets/externalshell/sitecustomize.py, line 580, in runfile
    execfile(filename, namespace)

  File /home/luke/Documents/PythonPrograms/ModeSolver_StepIndex/ModeSolver_StepIndex.py, line 52, in <module>
    x = fsolve(func,0)

  File /usr/lib64/python2.7/site-packages/scipy/optimize/minpack.py, line 140, in fsolve
    res = _root_hybr(func, x0, args, jac=fprime, **options)

  File /usr/lib64/python2.7/site-packages/scipy/optimize/minpack.py, line 197, in _root_hybr
    shape, dtype = _check_func('fsolve', 'func', func, x0, args, n, (n,))

  File /usr/lib64/python2.7/site-packages/scipy/optimize/minpack.py, line 20, in _check_func
    res = atleast_1d(thefunc(*((x0[:numinputs],) + args)))

TypeError: 'numpy.ndarray' object is not callable
07/03/2016 को 23:14
का स्रोत उपयोगकर्ता
अन्य भाषाओं में...                            


2 जवाब

वोट
0

आप करने के लिए एक समारोह में उत्तीर्ण होना fsolveएक नहीं array

मैं सिर्फ अपने समारोह प्रिंट हैं:

func
array([ -1.04882076e+01,  -1.04881526e+01,  -1.04879876e+01,
        -1.04877125e+01,  -1.04873274e+01,  -1.04868321e+01,
        -1.04862266e+01,  -1.04855109e+01,  -1.04846847e+01,
        -1.04837481e+01,  -1.04827008e+01,  -1.04815428e+01,
        -1.04802738e+01,  -1.04788938e+01,  -1.04774024e+01,
        -1.04757996e+01,  -1.04740850e+01,  -1.04722585e+01,
        -1.04703198e+01,  -1.04682686e+01,  -1.04661046e+01,
        -1.04638275e+01,  -1.04614371e+01,  -1.04589330e+01,
        -1.04563147e+01,  -1.04535820e+01,  -1.04507345e+01,
        -1.04477718e+01,  -1.04446934e+01,  -1.04414988e+01,
... ]

जिसे एक श्रृंखला है, लेकिन आप एक समारोह चाहते हैं। कुछ इस तरह काम करता है:

def linear(x):
    return 2*x+4

fsolve(linear, 0)

कैसे एक अपने कार्य, हालांकि निर्धारित कर सकते हैं पता नहीं है।

07/03/2016 को 23:37
का स्रोत उपयोगकर्ता

वोट
1

ऐसा इसलिए है क्योंकि fsolve तर्क के रूप में एक समारोह लेता है। इस प्रयास करें, आप अभी भी ध्यान दें कि कुछ रनटाइम त्रुटि का सामना करेंगे, तो आप मुझे लगता है कि छोड़ देंगे आप यह पता लगाने के लिए, अगर समारोह से अपनी वापसी ठीक से निर्माण किया है की जाँच करनी होगी।

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

# Constants
wavelength = 0.6328
ncore = 1.462420
nclad = 1.457420
a = 8.335

# Mode Order
# l = 0

# Mode parameters
V = (2 * np.pi * a / wavelength) * np.sqrt(ncore**2 - nclad**2)
U = np.arange(0, V, 0.01)
W = np.sqrt(V**2-U**2)

def func(l):
    return U * scipy.special.jv(l+1, U) / scipy.special.jv(l, U) - W * scipy.special.kv(l+1, W) / scipy.special.kv(l, W)

from scipy.optimize import fsolve
x = fsolve(func,0)
print x
07/03/2016 को 23:40
का स्रोत उपयोगकर्ता

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more