MATLAB实现Lorenz系统Poincaré截面分析

版权申诉
0 下载量 155 浏览量 更新于2024-10-03 收藏 1KB ZIP 举报
资源摘要信息:"Lorenz系统的Poincaré截面Matlab程序包" 在混沌理论和动态系统分析中,Poincaré截面是一种强有力的可视化工具,用于观察和分析动态系统的定性行为。Lorenz系统是一个著名的三维动力学系统,由三个常微分方程构成,最初由气象学家爱德华·洛伦兹(Edward Lorenz)在研究大气对流时提出。Lorenz系统因其对初始条件的极度敏感性而成为混沌理论中的一个经典模型。 Poincaré截面是将一个周期性动态系统的轨迹投影到一个固定的二维平面上,以揭示系统行为的更深层次结构。对于一个三维系统,Poincaré截面通常可以显示出系统轨迹的截线,而这些截线能够帮助我们理解系统周期轨道的存在、稳定性以及混沌特性。 本压缩包中的文件"lorenzpoincare.m"是一个Matlab脚本文件,它包含了计算Lorenz系统Poincaré截面的所有必要代码。这个脚本设计得不需要任何修改就可以直接运行,从而允许用户快速地可视化Lorenz系统的Poincaré截面。用户可以通过观察Poincaré截面来分析Lorenz系统的混沌行为,例如系统轨迹的敏感依赖性、奇怪吸引子的存在等。 为了理解和使用本Matlab程序包,需要具备一些基础知识和技能,包括: 1. Matlab编程基础:用户需要熟悉Matlab编程环境,能够理解Matlab语法以及如何运行Matlab脚本。 2. 动态系统理论:了解动态系统的概念,比如状态空间、相空间、轨迹、吸引子、极限环、混沌等。 3. Lorenz系统理解:了解Lorenz系统的三个方程及其参数含义,包括σ(Prandtl数)、ρ(Rayleigh数)、β(几何因子)。 4. Poincaré映射:掌握Poincaré截面的基本概念,以及如何通过Poincaré映射来分析动态系统的周期性和混沌性。 5. 数值分析知识:了解数值积分方法,如四阶龙格-库塔法(Runge-Kutta method),因为动态系统的数值模拟通常需要借助这类方法。 通过运行"lorenzpoincare.m"文件,Matlab将会根据Lorenz系统的方程进行计算,并将结果在Poincaré截面上显示出来。通常,Lorenz系统的Poincaré截面显示出一种复杂而混乱的点集,这表明了Lorenz系统的混沌特性。在特定的参数设置下,用户可能还会观察到某些规则的图案,这些可能对应于系统的周期轨道。 最终,Matlab中的Poincaré截面可以帮助研究者和学生直观地理解Lorenz系统的动态行为,并为进一步的混沌理论研究提供基础。通过对截面图的分析,可以得到关于系统长期行为的洞察,这在天气预测、流体动力学和其他领域具有重要意义。

import numpy as np import matplotlib.pyplot as plt import pickle as pkl import pandas as pd import tensorflow.keras from tensorflow.keras.models import Sequential, Model, load_model from tensorflow.keras.layers import LSTM, GRU, Dense, RepeatVector, TimeDistributed, Input, BatchNormalization, \ multiply, concatenate, Flatten, Activation, dot from sklearn.metrics import mean_squared_error,mean_absolute_error from tensorflow.keras.optimizers import Adam from tensorflow.python.keras.utils.vis_utils import plot_model from tensorflow.keras.callbacks import EarlyStopping from keras.callbacks import ReduceLROnPlateau df = pd.read_csv('lorenz.csv') signal = df['signal'].values.reshape(-1, 1) x_train_max = 128 signal_normalize = np.divide(signal, x_train_max) def truncate(x, train_len=100): in_, out_, lbl = [], [], [] for i in range(len(x) - train_len): in_.append(x[i:(i + train_len)].tolist()) out_.append(x[i + train_len]) lbl.append(i) return np.array(in_), np.array(out_), np.array(lbl) X_in, X_out, lbl = truncate(signal_normalize, train_len=50) X_input_train = X_in[np.where(lbl <= 9500)] X_output_train = X_out[np.where(lbl <= 9500)] X_input_test = X_in[np.where(lbl > 9500)] X_output_test = X_out[np.where(lbl > 9500)] # Load model model = load_model("model_forecasting_seq2seq_lstm_lorenz.h5") opt = Adam(lr=1e-5, clipnorm=1) model.compile(loss='mean_squared_error', optimizer=opt, metrics=['mae']) #plot_model(model, to_file='model_plot.png', show_shapes=True, show_layer_names=True) # Train model early_stop = EarlyStopping(monitor='val_loss', patience=20, verbose=1, mode='min', restore_best_weights=True) #reduce_lr = ReduceLROnPlateau(monitor='val_loss', factor=0.2, patience=9, verbose=1, mode='min', min_lr=1e-5) #history = model.fit(X_train, y_train, epochs=500, batch_size=128, validation_data=(X_test, y_test),callbacks=[early_stop]) #model.save("lstm_model_lorenz.h5") # 对测试集进行预测 train_pred = model.predict(X_input_train[:, :, :]) * x_train_max test_pred = model.predict(X_input_test[:, :, :]) * x_train_max train_true = X_output_train[:, :] * x_train_max test_true = X_output_test[:, :] * x_train_max # 计算预测指标 ith_timestep = 10 # Specify the number of recursive prediction steps # List to store the predicted steps pred_len =2 predicted_steps = [] for i in range(X_output_test.shape[0]-pred_len+1): YPred =[],temdata = X_input_test[i,:] for j in range(pred_len): Ypred.append (model.predict(temdata)) temdata = [X_input_test[i,j+1:-1],YPred] # Convert the predicted steps into numpy array predicted_steps = np.array(predicted_steps) # Plot the predicted steps #plt.plot(X_output_test[0:ith_timestep], label='True') plt.plot(predicted_steps, label='Predicted') plt.legend() plt.show()

2023-06-12 上传