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')

修改说明:

  1. 简化循环逻辑: 原始代码使用嵌套循环来处理数据,并且存在大量的索引计算。优化后的代码使用 B1.shape[0] // 2 直接计算循环次数,并使用 np.wherevalid_indices 来提取有效数据,简化了循环逻辑。

  2. 优化条件屈服点查找: 原始代码使用多个变量来记录条件屈服点的位置,逻辑较为复杂。优化后的代码使用 np.argmax 直接查找条件屈服点的位置,简化了逻辑。

  3. 合并插值计算: 原始代码分别对条件屈服点和塑性阶段数据进行插值计算。优化后的代码使用同一个插值函数 interp1d,并根据需要修改插值类型,简化了代码。

  4. 简化数据处理: 原始代码使用多个变量和循环来处理数据。优化后的代码使用 np.nonzeronp.sum 来去除矩阵中的多余 0 值,简化了数据处理逻辑。

优点:

  • 效率更高:优化后的代码减少了循环次数和索引计算,提高了代码效率。
  • 更易理解:优化后的代码逻辑更加清晰简洁,易于理解和维护。
  • 更不容易出现未知错误:优化后的代码减少了变量使用和循环嵌套,降低了出现未知错误的概率。

注意:

  • 修改后的代码中数据处理部分与原始代码保持一致,没有进行进一步的优化。
  • 代码中的文件路径需要根据实际情况进行修改。
  • 以上优化建议仅供参考,具体优化方案需要根据实际需求进行调整。
Python 代码优化:应力应变曲线插值计算

原文地址: https://www.cveoy.top/t/topic/pgAd 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录