【发布时间】:2019-11-29 09:02:54
【问题描述】:
我想估计 x 的值。所以当我将 x 作为我的参数时,这是对我有用的代码。
`
import numpy as np
import matplotlib.pyplot as plt
from lmfit import Parameters, minimize
from numpy import exp, linspace, random
def gaussian(x, amp, cen, wid):
return amp * exp(-(x-cen)**2 / wid)
x = linspace(-10, 10, 101)
data = gaussian(x, 2.33, 0.21, 1.51) + random.normal(0, 0.2, x.size)
Model = gaussian(x, 2.33,0.21,1.51)
plt.plot(x, data, label = 'data')
plt.plot(x, Model, label = 'Model')
plt.legend()
plt.grid(True)
plt.show()
d = 50
print ("\nThe data value at {} is {}\n".format(0, data[0+d]))
params = Parameters()
params.add('x', value =-3)
def objective(params, amp, cen, wid, data):
x = params['x']
m = gaussian(x, amp, cen, wid)
return data - m
result = minimize(objective, params=params, args=(2.33, 0.21, 1.51,data[d]))
print(result.params)
`
所以这里我的参数是 x。 在我的目标函数中,我给出了 50 处的数据值,它对应于 0 处的 x。 我将参数的初始值初始化为接近 0,因此我将其设置为 -3。
当您打印 result.params 时,您会看到它收敛到 0。
现在如果我将 amp cen 和 wid 作为参数,它会给我一个错误
TypeError:*后的objective()参数必须是可迭代的,而不是numpy.float64
`
import numpy as np
import matplotlib.pyplot as plt
from lmfit import Parameters, minimize
from numpy import exp, linspace, random
def gaussian(x, amp, cen, wid):
return amp * exp(-(x-cen)**2 / wid)
x = linspace(-10, 10, 101)
data = gaussian(x, 2.33, 0.21, 1.51) + random.normal(0, 0.2, x.size)
Model = gaussian(x, 2.33,0.21,1.51)
plt.plot(x, data, label = 'data')
plt.plot(x, Model, label = 'Model')
plt.legend()
plt.grid(True)
plt.show()
d = 50
print ("\nThe data value at {} is {}\n".format(0, data[0+d]))
params = Parameters()
params.add('x', value =-5)
params.add('amp', value = 1)
params.add('cen', value = 1)
params.add('wid', value = 1)
def objective(params, data):
x = params['x']
amp = params['amp']
cen = params['cen']
wid = params['wid']
m = gaussian(x, amp, cen, wid)
return data - m
result = minimize(objective, params=params, args=( data[d]))
print(result.params)
`
我做错了什么?
【问题讨论】:
标签: python numpy minimize minimization lmfit