Use of fsolve and numpy



我试图使用fsolve或scipy.optimize.newton尝试最小化(复杂矩阵)函数时,我有一个issu。确实,我的功能是具有复杂值的2*2矩阵。首先,我在一个称为real()的类中定义了我的功能,并由我的主program.py.py:

调用我的功能
import sys,os
import numpy as np
import random, math 
from scipy.optimize import fsolve
from scipy import optimize
class real :
    def __init__(self):
        self.w = 2
    def func1(self,eps):
        self.k_ch=2.5*np.exp(eps)
        f=np.array([[0,eps*3*self.k_ch+0.032],[0,self.w]])
        return f  

我的主要程序是:

import sys,os
import numpy as np
import random, math, cmath
from scipy.optimize import fsolve
from Carlo import *
A=real()
eps=0.003+0.0042j
C=A.func1(eps)
Cp=0
track=1e-03
variable=np.arange(track,0.1,1)
for track in variable:
    Cp=Cp+1
    if Cp==1:
         eps_real=0
    elif Cp==1:
         fray=np.array([Cp-1,2])
         eps_real=fray/2*3.14*track
    R_0= fsolve(C,eps.real)
    print R_0
    if xtol<=1e-04:
        value_stock= np.array([Cp-1,2])
    print 'R_0 value is', R_0

但是我有一个错误:

Traceback (most recent call last):
  File "Main.py", line 29, in <module>
    R_0= fsolve(C,eps.real)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/scipy/optimize/minpack.py", line 127, in fsolve
    res = _root_hybr(func, x0, args, jac=fprime, **options)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/scipy/optimize/minpack.py", line 183, in _root_hybr
    _check_func('fsolve', 'func', func, x0, args, n, (n,))
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/scipy/optimize/minpack.py", line 14, in _check_func
    res = atleast_1d(thefunc(*((x0[:numinputs],) + args)))
TypeError: 'numpy.ndarray' object is not callable

由于我是Python的新初学者,所以我不知道该如何处理。如果您有任何想法,请帮助我。似乎FSOLVE可能不喜欢复杂的值,但是我使用scipy.optimize.newton遇到了相同的错误。

谢谢。

fsolve在第一个参数中需要一个函数。您提供的Cnumpy.ndarray,而不是函数。

我想知道为什么您要在指出minimize函数时使用fsolve?如果您想要的是最小化,那么从Scipy直接进行此示例。优化教程可能会使您进入轨道:

import numpy as np
from scipy.optimize import minimize
def rosen(x):
    """The Rosenbrock function"""
    return sum(100.0*(x[1:]-x[:-1]**2.0)**2.0 + (1-x[:-1])**2.0)
x0 = np.array([1.3, 0.7, 0.8, 1.9, 1.2])
res = minimize(rosen, x0, method='nelder-mead',
                options={'xtol': 1e-8, 'disp': True})
print(res.x)
[ 1.  1.  1.  1.  1.]

最新更新