Объект 'numpy.ndarray' не вызывает ошибку с optimize.minimize - PullRequest
0 голосов
/ 23 ноября 2018

Я хочу дополнить набор данных простой функцией sin ^ 2 и определить ее минимумы на основе установленных параметров.

Вот мой код:

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

data = np.loadtxt('data.txt', usecols=(0,1))
x = data[:,0]*np.pi/180
y = data[:,1]

plt.scatter(x, y, c='red')

def sine(t,a,b,c):
    return a*(np.sin(b*(t-c)))**2

params, cov = optimize.curve_fit(sine, x, y, p0=[9500, 0.5, 0])
print(params)

t = np.linspace(0, 2*np.pi/3, 120) 
plt.plot(t, sine(t, *params), 'black')

plt.show()

optimize.minimize(sine(t, *params), x0=0)

Всевсе в порядке, за исключением вызова minimize, поскольку я получаю следующую ошибку (с полным обратным отслеживанием):

TypeError                                 Traceback (most recent call last)
~\Documents\CNR\Calibrazione_lamine_20181112\Fit.py in <module>()
     23 plt.show()
     24 
---> 25 optimize.minimize(sine(t, *params), x0=0)

~\Anaconda3\lib\site-packages\scipy\optimize\_minimize.py in minimize(fun, x0, args, method, jac, hess, hessp, bounds, constraints, tol, callback, options)
    442         return _minimize_cg(fun, x0, args, jac, callback, **options)
    443     elif meth == 'bfgs':
--> 444         return _minimize_bfgs(fun, x0, args, jac, callback, **options)
    445     elif meth == 'newton-cg':
    446         return _minimize_newtoncg(fun, x0, args, jac, hess, hessp, callback,

~\Anaconda3\lib\site-packages\scipy\optimize\optimize.py in _minimize_bfgs(fun, x0, args, jac, callback, gtol, norm, eps, maxiter, disp, return_all, **unknown_options)
    911     else:
    912         grad_calls, myfprime = wrap_function(fprime, args)
--> 913     gfk = myfprime(x0)
    914     k = 0
    915     N = len(x0)

~\Anaconda3\lib\site-packages\scipy\optimize\optimize.py in function_wrapper(*wrapper_args)
    290     def function_wrapper(*wrapper_args):
    291         ncalls[0] += 1
--> 292         return function(*(wrapper_args + args))
    293 
    294     return ncalls, function_wrapper

~\Anaconda3\lib\site-packages\scipy\optimize\optimize.py in approx_fprime(xk, f, epsilon, *args)
    686 
    687     """
--> 688     return _approx_fprime_helper(xk, f, epsilon, args=args)
    689 
    690 

~\Anaconda3\lib\site-packages\scipy\optimize\optimize.py in _approx_fprime_helper(xk, f, epsilon, args, f0)
    620     """
    621     if f0 is None:
--> 622         f0 = f(*((xk,) + args))
    623     grad = numpy.zeros((len(xk),), float)
    624     ei = numpy.zeros((len(xk),), float)

~\Anaconda3\lib\site-packages\scipy\optimize\optimize.py in function_wrapper(*wrapper_args)
    290     def function_wrapper(*wrapper_args):
    291         ncalls[0] += 1
--> 292         return function(*(wrapper_args + args))
    293 
    294     return ncalls, function_wrapper

TypeError: 'numpy.ndarray' object is not callable.

Я что-то упускаю, но не знаю, что.


Я добавляю файл данных для запуска этой программы, как было предложено

0   405
5   20
10  350
15  1380
20  2900
25  4750
30  6450
35  8100
40  9100
45  9800
50  10100
55  10250
60  9400
65  8400
70  6430
75  4900
80  3030
85  1500
90  400
95  17
100 410
105 1550
110 3100
115 4850
120 6780

Ответы [ 2 ]

0 голосов
/ 23 ноября 2018

minimize ожидает функцию в качестве первого аргумента, однако в настоящее время вы передаете

sine(t, *params)

, который является пустым массивом.

Вы можете это исправить и сделать:

print(optimize.minimize(sine, x0=[0], args=tuple(params)))

Это напечатает

      fun: 2.4080485986582715e-12
 hess_inv: array([[1.15258817e-05]])
      jac: array([8.19961349e-09])
  message: 'Optimization terminated successfully.'
     nfev: 18
      nit: 4
     njev: 6
   status: 0
  success: True
        x: array([0.09203053])
0 голосов
/ 23 ноября 2018

В документации scipy функция optimize.minimize принимает ndarray или shape(n) в качестве ввода для x,, а не целое число.Я думаю, что ошибка возникает оттуда, потому что в их трассировке ошибок

--> 913     gfk = myfprime(x0)

ошибка возникает из этой функции.

Документация ссылка .

...