python - fmin python 传递参数
问题描述
我试图找到函数 func_exp 的最小值。该函数有 3 个参数,我从拟合中得到。然后我想找到函数沿 x 轴的最小值 (y)。在使用拟合参数时。为此,我正在尝试使用 scipy 中的 fin
但是我似乎不太明白如何将参数传递给 fin 函数。使用当前代码,我收到以下错误:
ValueError:使用序列设置数组元素。
对于任何帮助,我将不胜感激。
import numpy as np
from scipy.optimize import curve_fit
import matplotlib.pyplot as plt
from scipy.optimize import fmin
def func_exp(x,a,b,c):
return -a*(1-(1-np.exp(-b*(x-c)))**2)
class morse:
def __init__(self):
self.masses = {'H': 1, 'D': 2, 'C': 12, 'O': 16}
def exponential_regression (self,x_data, y_data):
self.popt, pcov = curve_fit(func_exp, x, y, p0 = (0.5, 1.4, 3))
print(self.popt)
puntos = plt.plot(x, y, 'x', color='xkcd:maroon', label = "data")
x_data= np.linspace(np.amax(x),np.amin(x),100)
curva_regresion = plt.plot(x_data, func_exp(x_data, *self.popt), color='xkcd:teal', label = "fit: {:.3f}, {:.3f}, {:.3f}".format(*self.popt))
plt.xlim([2, 5.5 ])
plt.ylim([-5.5, 5 ])
plt.legend()
plt.show()
return func_exp(x, *self.popt)
if __name__ == "__main__":
x = np.array([2.5,3,3.125,3.25,3.375,3.5,3.625,3.75,4,4.5,5,5.5])
y = np.array([17.27574826,-3.886390266,-4.892678401,-5.239229709,-5.193942987,-4.93131152,-4.557452444,-4.13446237,-3.276524893,-1.928242445,-1.17731394,-0.745240026])
morse=morse()
morse.exponential_regression(x, y)
fmin(func_exp,x,args=(morse.popt[0],morse.popt[1],morse.popt[2]))
解决方案
好的,我找到了解决方案。这里你要做的修改是只传递一个初始猜测值x
to fmin
。你正在通过x
,长度为 12。
代替
fmin(func_exp,x,args=(morse.popt[0],morse.popt[1],morse.popt[2]))
经过
fmin(func_exp,x[0],args=(morse.popt[0],morse.popt[1],morse.popt[2]))
您仅使用x
数组的第一个元素作为起点。
您也可以使用其他值作为x[1]
orx[-1]
并且所有将收敛到最小值。该函数现在将返回x
曲线具有最小值的值。答案是
array([3.30895996])
推荐阅读
- javascript - 根据下面提到的代码,xpath 的“text()”属性不适用于通过 Selenium 的文本节点
- python-3.x - 如何在 Discord 中发送嵌入到直接消息?
- storybook - 指定 Storybook 的默认页面
- swift - 在 Watchkit 表格行中看不到 Spritekit 场景
- html - Spring boot 请求的映射值变量
- sql - PostgreSQL - 类似的替代品,包含
- reactjs - Wordpress Gutenberg React – 使用 HTML 渲染变量
- reactjs - 如果状态没有变化,则强制重新加载反应 js 组件
- typescript - 为什么这个包装的样式组件错误“没有共同的属性”
- iis -
- 匹配包含字符串的 URL