Чтобы сравнить результаты, я решил эту проблему с помощью нелинейного демпфера. (ANN) и линейный демпфер со Scipy и Gekko. Однако решение Gekko неверно в случае нелинейной задачи.
Ссылки на модель ANN Keras и пробную_1.csv
модель Gekko:
Код: Выделить всё
m_s = 400
m_u = 47.75
k_t = 239e3
k = 22e3
c = 2300
linear_damper = True
m = GEKKO()
m.time = np.linspace(0,5,100)
x0 = m.Var(value=0)
x1 = m.Var(value=0)
x2 = m.Var(value=0)
x3 = m.Var(value=0)
x_d = x0-x1
v_d =x2-x3
f_ks = k *(x0-x1)
f_kt = k_t * (x1-0.023)
if linear_damper:
f_ds = c*v_d
else:
model_keras = keras.models.load_model('model_81_DVYF_tanh.keras')
mma = ([-0.83045, -21.0116, 0.0],
[0.82392, 21.5598, 2.95],
[-1715.8771],
[1416.5227])
f_ds = 4* Gekko_NN_TF(model_keras,mma,m,n_output = 1,activationFxn='tanh').predict([x_d,v_d,2.5])
#
m.Equation(m_s * x2.dt() == -f_ks -f_ds)
m.Equation(m_u * x3.dt() == f_ks - f_kt + f_ds)
m.Equation(x0.dt() == x2)
m.Equation(x1.dt() == x3)
m.options.IMODE = 4
m.options.NODES= 4
m.solve(disp=True)
Код: Выделить всё
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from tensorflow import keras
from sklearn.preprocessing import MinMaxScaler
from sklearn.model_selection import train_test_split
from scipy import integrate
# import data to init the scaler
df = pd.read_csv("MR dataset/Exp_1/trial_1.csv")
train_x, test_x, train_y, test_y = train_test_split(df[['D','V','Y']], df['F'], test_size=0.2)
train_x = train_x.to_numpy()
test_x = test_x.to_numpy()
train_y = train_y.to_numpy().reshape(-1,1)
test_y = test_y.to_numpy().reshape(-1,1)
input_scaler = MinMaxScaler(feature_range=(-1, 1))
output_scaler = MinMaxScaler(feature_range=(-1, 1))
train_x_s= input_scaler.fit_transform(train_x)
train_y_s= output_scaler.fit_transform(train_y)
# Scipy model
f_ds_history=[]
f_ks_history=[]
m_s = 400
m_u = 47.75
k_t = 239e3
k = 22e3
c = 2300
mr_damper_cof = 4
model_keras = keras.models.load_model('model_81_DVYF_tanh.keras')
Non_linear = True
v_history=[]
def ode_rule(t,x):
x0 = x[0] # m_s displacement
x1 = x[1] # m_u displacement
x2 = x[2] # m_s velocity
x3 = x[3] # m_u velocity
vol = 2.5
f_ks = k *(x0-x1)
f_kt = k_t * (x1-0.023)
if Non_linear:
scaled_input =input_scaler.transform(np.array([x0-x1,x2-x3,vol]).reshape(1,-1))
f_ds_scaled = model_keras.predict(scaled_input)
f_ds = mr_damper_cof * output_scaler.inverse_transform(f_ds_scaled)[0][0]
else:
f_ds = c*(x2-x3)
f_ds_history.append(f_ds)
f_ks_history.append(f_ks)
v_history.append(x2-x3)
x0_dot = x2
x1_dot = x3
x2_dot = (-f_ks-f_ds)/m_s
x3_dot = (f_ks+f_ds-f_kt)/m_u
return np.array([x0_dot,x1_dot,x2_dot,x3_dot])
# solve the ODE
sol = integrate.solve_ivp(ode_rule,(0,5),np.zeros(4),method = 'RK45')
# plot the results
plt.plot(m.time, x0, label='Gekko (linear damper)')
plt.plot(sol.t, sol.y[0],'-.r' , label='Scipy (nonlinear damper (ANN))')
plt.legend()
plt.show()


пожалуйста, дайте мне знать, что не так с моей моделью Gekko_NN_TF?
Подробнее здесь: https://stackoverflow.com/questions/789 ... ekko-nn-tf