【发布时间】:2019-04-25 22:38:18
【问题描述】:
我想用一个简单的 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
【问题讨论】:
-
我猜你只需要
x0=[0]或类似的东西(取决于你使用了多少变量)。只需确保提供与变量数量相同长度的列表即可。 -
我已经尝试使用
x0=[0],但我得到了同样的错误。 -
好的,你能提供一些数据来重现错误吗?!这样更容易提供帮助。
-
您能解释一下您希望通过此
minimize电话实现什么目标吗?您已经使用curve_fit拟合了参数。 -
我想找到最小化我的功能的角度值,
optimize.minimize(sine, x0=[0], args=(params[0], params[1], params[2]))显然工作正常。谢谢!
标签: python python-3.x numpy scipy minimize