Python 代码优化:应力应变曲线插值计算
import pandas as pd
import numpy as np
from scipy.interpolate import interp1d
# 导入数据
M0 = pd.read_csv('E:\shujushuchu\shuchu1.csv') # 导入四个参数
M1 = pd.read_csv('E:\shujushuchu\shuru1.csv') # 导入 ABAQUS 生成的应力应变曲线的点
B0 = M0.values
B1 = M1.values # 将导入的参数转换为矩阵
# 优化后的计算逻辑
for i in range(B1.shape[0] // 2):
# 获取有效数据并提取应力应变数据
valid_indices = np.where(~np.isnan(B1[2 * i, :]))[0]
B5 = np.zeros((2, len(valid_indices)))
B5[0, :] = B1[2 * i, valid_indices]
B5[1, :] = B1[2 * i + 1, valid_indices]
# 计算弹性模量
C = B5[1, 2] / B5[0, 2]
# 寻找条件屈服点
a6 = np.argmax(B5[1, :] <= C * (B5[0, :] - 0.002)) + 2
B7 = np.zeros((2, 3))
B7[:, 0:2] = B5[:, a6 - 3:a6 - 1]
B7[:, 2] = B5[:, a6 - 1]
# 插值计算条件屈服点
a11 = (B7[0, 2] - B7[0, 1]) / 500
f1 = interp1d(B7[0, :], B7[1, :], kind='linear')
for i2 in np.arange(B7[0, 1], B7[0, 2], a11):
a12 = f1(i2)
if a12 <= C * (i2 - 0.002):
break
B2 = np.zeros((2, 2))
B2[:, 0] = B5[:, a6 - 2]
B2[:, 1] = np.array([i2 - a11, a12 - C * a11])
# 插值计算塑性阶段数据
a7 = (np.max(B2[0, :]) - B2[0, 1]) / 500
B6 = np.zeros((2, 10000))
a10 = 0
f2 = interp1d(B2[0, :], B2[1, :], kind='cubic')
for i3 in np.arange(B2[0, 0], np.max(B2[0, :]) + a7, a7):
a20 = min(i3 + a7, np.max(B2[0, :]))
a23 = min(i3, np.max(B2[0, :]))
a8 = f2(a23)
a9 = f2(a20)
derivative = (a9 - a8) / a7
if derivative - a9 >= 0:
a10 += 1
B6[0, a10 - 1] = i3
B6[1, a10 - 1] = a8
# 处理数据并保存结果
B6 = B6[:, np.nonzero(np.sum(B6, axis=0))[0]]
df = pd.DataFrame(B6)
writer = pd.ExcelWriter('output3.xlsx', engine='openpyxl')
df.to_excel(writer, sheet_name='Sheet1', index=False)
writer.book.save('output3.xlsx')
if np.max(B6[0, :]) > 0.47:
continue
# 储存参数和计算结果
a2 += 1
B4[a2 - 1, :4] = B0[i, :4]
B3[a2 - 1, 9] = np.min(B6[0, :])
B3[a2 - 1, 10] = np.max(B6[0, :])
B6[0, :] = (B6[0, :] - B6[0, 0]) / (np.max(B6[0, :]) - B6[0, 0])
f = interp1d(B6[0, :], B6[1, :], kind='cubic')
xx = np.array([0, 0.03, 0.09, 0.18, 0.3, 0.45, 0.63, 0.84, 1.0])
yy = f(xx)
B3[a2 - 1, :9] = yy
# 处理矩阵并保存结果
B3 = B3[:, np.nonzero(np.sum(B3, axis=0))[0]]
B4 = B4[:, np.nonzero(np.sum(B4, axis=0))[0]]
df = pd.DataFrame(B3)
writer = pd.ExcelWriter('output1.xlsx', engine='openpyxl')
df.to_excel(writer, sheet_name='Sheet1', index=False)
writer.book.save('output1.xlsx')
df = pd.DataFrame(B4)
writer = pd.ExcelWriter('output2.xlsx', engine='openpyxl')
df.to_excel(writer, sheet_name='Sheet1', index=False)
writer.book.save('output2.xlsx')
修改说明:
-
简化循环逻辑: 原始代码使用嵌套循环来处理数据,并且存在大量的索引计算。优化后的代码使用
B1.shape[0] // 2直接计算循环次数,并使用np.where和valid_indices来提取有效数据,简化了循环逻辑。 -
优化条件屈服点查找: 原始代码使用多个变量来记录条件屈服点的位置,逻辑较为复杂。优化后的代码使用
np.argmax直接查找条件屈服点的位置,简化了逻辑。 -
合并插值计算: 原始代码分别对条件屈服点和塑性阶段数据进行插值计算。优化后的代码使用同一个插值函数
interp1d,并根据需要修改插值类型,简化了代码。 -
简化数据处理: 原始代码使用多个变量和循环来处理数据。优化后的代码使用
np.nonzero和np.sum来去除矩阵中的多余 0 值,简化了数据处理逻辑。
优点:
- 效率更高:优化后的代码减少了循环次数和索引计算,提高了代码效率。
- 更易理解:优化后的代码逻辑更加清晰简洁,易于理解和维护。
- 更不容易出现未知错误:优化后的代码减少了变量使用和循环嵌套,降低了出现未知错误的概率。
注意:
- 修改后的代码中数据处理部分与原始代码保持一致,没有进行进一步的优化。
- 代码中的文件路径需要根据实际情况进行修改。
- 以上优化建议仅供参考,具体优化方案需要根据实际需求进行调整。
原文地址: https://www.cveoy.top/t/topic/pgAd 著作权归作者所有。请勿转载和采集!