import numpy as np
import imageio
import os
import pandas as pd
import scipy.io
from matplotlib import pyplot as plt
from scipy.io import loadmat
# 解决中文问题
plt.rcParams['font.sans-serif'] = ['SimHei']
# 解决负号显示问题
plt.rcParams['axes.unicode_minus'] = False
# 定义时间点列表
time_points = ['0.2', '0.3', '0.4', '0.5', '0.6', '0.7', '0.8', '0.9', '1.0', '1.1', '1.2']
# 根据时间点数量计算子图布局的行数和列数
ncols = 3
nrows = (len(time_points) + ncols - 1) // ncols
# 准备画布
fig, axs = plt.subplots(nrows=nrows, ncols=ncols, figsize=(18, 6 * nrows))
axs = axs.flatten() # 将多维数组扁平化以便循环
for index, time_point in enumerate(time_points):
key_suffix = str(int(float(time_point) * 1000))
nonlinear_data_path = f'feixianxing/{time_point}miao.mat'
linear_data_path = f'xianxing/{time_point}miao.mat'
# 加载.mat文件
nonlinear_data = loadmat(nonlinear_data_path)
linear_data = loadmat(linear_data_path)
# 提取u的值
nonlinear_u = nonlinear_data[f'u_shuzu_{key_suffix}']
linear_u = linear_data[f'u_shuzu_{key_suffix}']
# 定义y的范围
y_range = np.linspace(0.0, 600, nonlinear_u.shape[0])
# 假设x=300对应的索引,这里根据您的网格决定
x_index = 50 # 假定中间值为x=300的位置
# 提取在x=300时的u值
nonlinear_u_at_x_300 = nonlinear_u[:, x_index]
linear_u_at_x_300 = linear_u[:, x_index]
# 在当前子图上绘制非线性和线性模型的y-u曲线
axs[index].plot(y_range, nonlinear_u_at_x_300, label='非线性模型', linestyle='-')
axs[index].plot(y_range, linear_u_at_x_300, label='线性模型', linestyle='--')
axs[index].set_title(f't={time_point}s', fontsize=14)
axs[index].set_xlabel('Y')
axs[index].set_ylabel('U')
axs[index].legend()
# 隐藏多余的子图
for i in range(len(time_points), len(axs)):
axs[i].axis('off')
plt.tight_layout()
plt.show()