Оптимизированные параметры вывода SCipy на самом деле не являются оптимальными.Как получить правильную оптиму?
Ниже приведен код, написанный для минимизации суммы квадратов ошибки функции.Фактическое оптимальное решение k = 600,0.21, но SCipy выводит (0,0.22).Также многие значения SSE - это «nan».
Может ли кто-нибудь помочь мне в этом отношении?Я новичок в этом.
Ниже приведены измеренные значения, загруженные из CSV-файла (упоминается в коде):
strain,stress
0.00,000.00
0.01,228.11
0.02,263.86
0.03,287.31
0.04,305.20
0.05,319.84
0.06,332.32
0.07,343.26
0.08,353.02
0.09,361.86
0.10,369.96
0.11,377.44
0.12,384.40
0.13,390.91
0.14,397.04
0.15,402.84
0.16,408.33
0.17,413.57
0.18,418.56
0.19,423.34
0.20,427.92
0.21,432.33
0.22,436.58
0.23,440.67
0.24,444.63
0.25,448.45
0.26,452.16
0.27,455.76
0.28,459.26
0.29,462.65
0.30,465.96
0.31,469.18
0.32,472.32
0.33,475.38
0.34,478.37
0.35,481.29
0.36,484.14
0.37,486.94
0.38,489.67
0.39,492.35
0.40,494.98
0.41,497.55
0.42,500.07
0.43,502.55
0.44,504.98
0.45,507.37
0.46,509.72
0.47,512.03
0.48,514.29
0.49,516.53
0.50,518.72
0.51,520.88
0.52,523.01
0.53,525.11
0.54,527.17
0.55,529.21
0.56,531.22
0.57,533.19
0.58,535.14
0.59,537.07
0.60,538.97
0.61,540.84
0.62,542.69
0.63,544.52
0.64,546.32
0.65,548.10
0.66,549.86
0.67,551.60
0.68,553.32
0.69,555.02
0.70,556.70
0.71,558.36
0.72,560.00
0.73,561.63
0.74,563.24
0.75,564.83
0.76,566.40
0.77,567.96
0.78,569.50
0.79,571.02
0.80,572.53
0.81,574.03
0.82,575.51
0.83,576.98
0.84,578.43
0.85,579.87
0.86,581.29
0.87,582.71
0.88,584.11
0.89,585.49
0.90,586.87
0.91,588.23
0.92,589.59
0.93,590.93
0.94,592.25
0.95,593.57
0.96,594.88
0.97,596.17
0.98,597.46
0.99,598.73
1.00,600.00
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from scipy.optimize import minimize
from sklearn.metrics import r2_score
url = 'test_data.csv'
z = pd.read_csv(url)
#
e1 = z['strain'].values
sigx = z['stress'].values
e=np.array(e1)
sig1=np.array(sigx)
k = [1000,0.2]
#n = 0.2
coe=np.array([k[0],k[1]])
#print (sig1)
def sig2(e):
v=k[0] * np.power(e, k[1])
SEzip = zip(sig1, v)
sse = 0
for y in SEzip:
sse += np.power((y[0] - y[1]),2)
print (sse)
return sse
print (sig2(e))
result = minimize(sig2,coe,method='Nelder-Mead',options={'xatol': 1e-6,'fatol':1e-06,'maxiter':10000,'disp': True,'adaptive' : True})
print(result)
Код должен дать k [0] =600 & k [1] = 0,21 в результате.