Результаты Gekko неверны при использовании gekko_nn_tfPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Результаты Gekko неверны при использовании gekko_nn_tf

Сообщение Anonymous »

Я создал модель четвертного автомобиля в Gekko, в которой сила демпфирования моделируется с помощью сети ИНС.
Чтобы сравнить результаты, я решил эту проблему с помощью нелинейного демпфера. (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)
Модель Scipy:

Код: Выделить всё

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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»