✅ 博主简介:擅长数据搜集与处理、建模仿真、程序设计、仿真代码、论文写作与指导,毕业论文、期刊论文经验交流。
✅ 具体问题可以私信或扫描文章底部二维码。
在当今社会,人们对绿色低碳、节能减排的关注度日益增加,这使得工业工程中的材料有了新的要求,即轻量化、可回收且具备高强度性能。这些要求对于结构和零件而言意义重大。在众多材料中,7XXX 系列的高强度铝合金因密度小、可回收、耐腐蚀且具有优异的力学性能和轻量化特性而得到广泛应用。特别是在航空领域,7075 铝合金发挥了重要作用。然而,这种铝合金的室温加工性能差,延伸率低,通常需要通过热冲压、轧制等热塑性加工成形方式。而热塑性成形工艺需要精确的本构模型来表征材料在复杂变形条件下的流动应力响应。
传统本构模型存在明显局限,它们往往仅能在较小的温度和应变速率范围内对材料本构模型进行拟合,而且预测精度很低。为了克服这些问题,针对 7075 高强度航空铝合金材料展开了大量实验。在较大温度范围和应变速率条件下进行单轴热拉伸实验,以此构建了一个丰富的实验数据库。这些实验数据为后续研究提供了坚实的基础。通过这些实验,获取了不同条件下材料的真实应力 - 应变曲线以及屈强比图示,对比分析不同变形条件下的流动应力响应行为。结果发现,在复杂变形条件下,材料的流动应力呈现出很强的非线性特征。这种非线性特征增加了准确描述材料本构关系的难度。
同时,对不同变形条件下微观金相组织和端口形貌进行了分析。发现宏观的流动应力特征受到微观组织演化的多种因素耦合影响。微观组织在演化过程中存在复杂性,而且这些微观组织难以直接观测,这对基于微观组织演化的物理内变量本构模型的拟合精度产生了负面影响,也阻碍了对这种模型的深入研究。这种现状促使我们寻求新的方法来建立更精确的本构模型,以更好地描述 7075 铝合金在复杂热变形条件下的特性。
(2) 深度学习本构模型的建立
基于上述实验结果和分析,着手建立基于深度学习的本构模型。考虑了前馈神经网络和循环神经网络这两种网络结构,编写了两大类六种不同结构的神经网络用于模型训练。在这个过程中,对给定相同条件下不同激活函数、神经单元和优化器的网络结构进行预测误差对比分析。激活函数和优化器的选择对模型的性能有着至关重要的影响。例如,不同的激活函数会改变神经元的输出特性,从而影响整个网络对数据的处理能力。而优化器则决定了网络在训练过程中如何调整权重以减小损失。
通过大量的对比实验和分析,综合考虑精度与计算效率,确定了在前馈神经网络中,Sigmiod 激活函数与 Adam 优化器的组合方法。这种组合方式能够在保证预测准确性的同时,使模型具有较好的稳定性。这意味着模型在面对新的数据时,能够给出可靠的预测结果,并且在不同的工况下都能保持相对稳定的性能。
为了进一步评估模型的适应性和泛化能力,在 Johson - Cook 方程的基础上建立了基于传统经验公式的唯象本构模型。通过对比这两种基于不同原理的本构模型的各项指标,包括对不同温度和应变速率条件下材料流动应力的预测准确性、模型在不同数据集上的稳定性等。对比结果进一步验证了基于深度神经网络本构模型具有复杂非线性表征能力和较强的适应性。它能够更好地捕捉 7075 铝合金在复杂热变形条件下的强非线性流动应力响应特性,相比传统的唯象本构模型具有明显优势。这种优势使得深度学习本构模型在处理复杂材料变形问题时更具潜力,为后续的工程应用提供了更可靠的理论支持。
(3) 有限元子程序二次开发与模型验证
在建立了深度学习本构模型和 JC 本构模型后,开展了有限元子程序的二次开发研究。使用 Fortran 语言对深层前馈神经网络结构的数据前项传播过程进行重构。这个过程涉及到对神经网络算法在有限元环境中的实现,需要深入理解神经网络的计算原理和有限元方法的结合点。通过这种重构,建立了耦合深度学习的各向同性塑性硬化有限元深度开发模型。
在模型验证阶段,通过对比验证实验的载荷位移指标来评估模型的性能。结果显示,深度学习本构模型相比传统本构模型有显著优势。它能够有效改善传统本构模型的预测精度,更准确地描述材料在复杂变形过程中的力学行为。这使得在有限元模拟中,能够更精确地预测材料在热塑性加工成形过程中的变形情况,为工艺优化提供更可靠的依据。同时,深度学习本构模型还增强了本构模型的使用范围和泛化能力,使其不仅适用于特定的实验条件,在更广泛的工业应用场景中也能发挥作用。这对于 7075 铝合金在航空等领域的热塑性加工成形工艺设计和优化具有重要意义,能够提高产品质量,减少工艺设计中的试错成本,推动相关行业的发展。
% 生成模拟数据(这里只是简单模拟与应力应变相关的数据)
num_data_points = 1000;
temperature_range = [200 500]; % 温度范围
strain_rate_range = [0.001 0.1]; % 应变速率范围
temperature_data = rand(num_data_points, 1) * (temperature_range(2) - temperature_range(1)) + temperature_range(1);
strain_rate_data = rand(num_data_points, 1) * (strain_rate_range(2) - strain_rate_range(1)) + strain_rate_range(1);
% 假设应力与温度和应变速率有某种关系(这里是简单的函数关系)
true_stress_data = 100 + 0.5 * temperature_data + 500 * strain_rate_data + 0.1 * temperature_data.* strain_rate_data + 10 * randn(num_data_points, 1);
% 数据归一化
normalized_temperature = (temperature_data - min(temperature_data)) / (max(temperature_data) - min(temperature_data));
normalized_strain_rate = (strain_rate_data - min(strain_rate_data)) / (max(strain_rate_data) - min(strain_rate_data));
normalized_stress = (true_stress_data - min(true_stress_data)) / (max(true_stress_data) - min(true_stress_data));
% 组合输入数据
input_data = [normalized_temperature normalized_strain_rate];
% 划分训练集和测试集
train_ratio = 0.8;
num_train = floor(num_data_points * train_ratio);
train_input = input_data(1:num_train, :);
train_target = normalized_stress(1:num_train);
test_input = input_data(num_train + 1:end, :);
test_target = normalized_stress(num_train + 1:end);
% 神经网络参数
num_hidden_units = 10; % 隐藏单元数量
learning_rate = 0.01;
epochs = 100;
% 随机初始化权重
input_weights = rand(num_hidden_units, size(train_input, 2));
bias_weights = rand(num_hidden_units, 1);
output_weights = rand(1, num_hidden_units);
for epoch = 1:epochs
% 前向传播
hidden_layer_output = sigmoid(train_input * input_weights' + repmat(bias_weights', num_train, 1));
predicted_output = sigmoid(hidden_layer_output * output_weights');
% 计算损失(这里使用均方误差)
loss = mean((train_target - predicted_output).^2);
% 反向传播
d_output = (predicted_output - train_target).* predicted_output.* (1 - predicted_output);
d_hidden = d_output * output_weights.* hidden_layer_output.* (1 - hidden_layer_output);
d_output_weights = hidden_layer_output' * d_output;
d_input_weights = d_hidden' * train_input;
d_bias_weights = sum(d_hidden, 1);
% 更新权重
output_weights = output_weights - learning_rate * d_output_weights;
input_weights = input_weights - learning_rate * d_input_weights;
bias_weights = bias_weights - learning_rate * d_bias_weights;
% 每 10 个 epoch 打印一次损失
if mod(epoch, 10) == 0
fprintf('Epoch %d: Loss = %f\n', epoch, loss);
end
end
% 在测试集上测试模型
test_hidden_layer_output = sigmoid(test_input * input_weights' + repmat(bias_weights', size(test_input, 1), 1));
test_predicted_output = sigmoid(test_hidden_layer_output * output_weights');
test_loss = mean((test_target - test_predicted_output).^2);
fprintf('Test Loss = %f\n', test_loss);