Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用;“最小二乘法”;用Python_Python_Python 3.x_Optimization_Scipy_Least Squares - Fatal编程技术网

如何使用;“最小二乘法”;用Python

如何使用;“最小二乘法”;用Python,python,python-3.x,optimization,scipy,least-squares,Python,Python 3.x,Optimization,Scipy,Least Squares,我需要确定等式中ceo系数的值。为此,我决定使用最小二乘法。方程式如下所示: 该方程表示了不同温度水平下受试产品的应力和失效时间之间的关系。我所使用的数据是虚构的,但呈现了实际数据的结构,我将在后面使用。 为了更好地理解,我还提供了一个图形关联: 我对python相当陌生,所以我不知道有这么多方法/函数可用,所以我决定尝试以下几种方法: 输入数据 %matplotlib inline import numpy as np import matplotlib.pyplot as plt fro

我需要确定等式中ceo系数的值。为此,我决定使用最小二乘法。方程式如下所示:

该方程表示了不同温度水平下受试产品的应力和失效时间之间的关系。我所使用的数据是虚构的,但呈现了实际数据的结构,我将在后面使用。 为了更好地理解,我还提供了一个图形关联:

我对python相当陌生,所以我不知道有这么多方法/函数可用,所以我决定尝试以下几种方法:

输入数据

%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
from lmfit import minimize, Parameters, fit_report

# data
temp =np.array([650, 700, 750, 720, 680]) # temperature
xdata = np.array([500, 525, 540, 534, 490]) # time
ydata = np.array([330, 332, 315, 325, 335]) # stress
T = temp[0]


plt.plot(xdata,ydata,'*')
plt.xlabel('xdata')
plt.ylabel('ydata')
1。使用曲线拟合功能

def func(logS, a_0, a_1, a_2, T_a, logt_a):
    return  logt_a + (T - T_a) * (a_0 + a_1 * logS + a_2 * logS**2)

popt, pcov = curve_fit(func, xdata, ydata, p0=(1, 1, 1, 1, 1))
popt

zapis = 'a_0: {0:1.5e}\na_1: {1:1.5e}\na_2: {2:1.5e}\nT_a: {3:1.5e}\nlogt_a: {4:1.5e}'.format(popt[0], popt[1], popt[2], popt[3], popt[4])
print(zapis) 

a_0 = popt[0]
a_1 = popt[1]
a_2 = popt[2]
T_a = popt[3]
logt_a = popt[4]

residuals = ydata - func(logS, a_0, a_1, a_2, T_a, logt_a)
fres = sum(residuals**2)
print(fres)

curvex=np.linspace(np.min(xdata)-np.min(xdata)/10, np.max(xdata)+50,    np.max(xdata)/10)
curvey=func(curvex, a_0, a_1, a_2, T_a, logt_a)
plt.plot(xdata,ydata,'*')
plt.plot(curvex,curvey, 'r')
plt.xlabel('xdata')
plt.ylabel('ydata')
from scipy.optimize import leastsq

def function(parameters, logS):
    a_0, a_1, a_2, T_a, logt_a = parameters
    model = logt_a + (T - T_a) * (a_0 + a_1 * logS + a_2 * logS**2)
    return model

def objective(pars, t_r, logS):
    err =  t_r - function(pars, logS)
    return err

x0 = [ 1.0, 1.0, 1.0, 1.0, 1.0 ] #initial guess of parameters
plsq = leastsq(objective, x0, args=(ydata, xdata))

print('Fitted parameters = {0}'.format(plsq[0]))
plt.plot(xdata, ydata, 'ro')
#plot the fitted curve on top
x = np.linspace(min(xdata), max(xdata), 50)
y = function(plsq[0], x)
plt.plot(x, y, 'k-')
plt.xlabel('x')
plt.ylabel('y')
2。使用leastsq功能

def func(logS, a_0, a_1, a_2, T_a, logt_a):
    return  logt_a + (T - T_a) * (a_0 + a_1 * logS + a_2 * logS**2)

popt, pcov = curve_fit(func, xdata, ydata, p0=(1, 1, 1, 1, 1))
popt

zapis = 'a_0: {0:1.5e}\na_1: {1:1.5e}\na_2: {2:1.5e}\nT_a: {3:1.5e}\nlogt_a: {4:1.5e}'.format(popt[0], popt[1], popt[2], popt[3], popt[4])
print(zapis) 

a_0 = popt[0]
a_1 = popt[1]
a_2 = popt[2]
T_a = popt[3]
logt_a = popt[4]

residuals = ydata - func(logS, a_0, a_1, a_2, T_a, logt_a)
fres = sum(residuals**2)
print(fres)

curvex=np.linspace(np.min(xdata)-np.min(xdata)/10, np.max(xdata)+50,    np.max(xdata)/10)
curvey=func(curvex, a_0, a_1, a_2, T_a, logt_a)
plt.plot(xdata,ydata,'*')
plt.plot(curvex,curvey, 'r')
plt.xlabel('xdata')
plt.ylabel('ydata')
from scipy.optimize import leastsq

def function(parameters, logS):
    a_0, a_1, a_2, T_a, logt_a = parameters
    model = logt_a + (T - T_a) * (a_0 + a_1 * logS + a_2 * logS**2)
    return model

def objective(pars, t_r, logS):
    err =  t_r - function(pars, logS)
    return err

x0 = [ 1.0, 1.0, 1.0, 1.0, 1.0 ] #initial guess of parameters
plsq = leastsq(objective, x0, args=(ydata, xdata))

print('Fitted parameters = {0}'.format(plsq[0]))
plt.plot(xdata, ydata, 'ro')
#plot the fitted curve on top
x = np.linspace(min(xdata), max(xdata), 50)
y = function(plsq[0], x)
plt.plot(x, y, 'k-')
plt.xlabel('x')
plt.ylabel('y')
在这两种情况下,我都得到了以下结果:

a_0: -5.95683e+02
a_1: 2.65405e-02
a_2: -2.63017e-05
T_a: 1.21502e+02
logt_a: 3.11614e+05
问题1:确定搜索系数初始值的最佳方法是什么

问题2:python中基于最小二乘法的哪种方法最适合我的例子中的方程


问题3:是否有办法使确定系数作为参数的过程更加自动化?因为我还要尝试高阶多项式,这将导致更多的系数(a_3,a_4,a_5,…)。这个想法是写多项式的阶数,然后所有其他的都会自己计算和形成。

我不能给出明确的反馈,但有些东西可能会有所帮助。你想知道这两种方法的速度是否相同吗(因为你建议它们都收敛于同一个解,但我想知道它们是否在幕后做同样的事情)?关于第3点,是否合适,因为它最小化了平方误差,并且您可以指定顺序?