通过优化的多重曲线拟合

8次浏览(过去30天)
klmdr
klmdr 2023年1月27日
评论道: 亚历克斯·沙 2023年1月29日
你好,
我有不同温度和应变速率下的应变-应力数据(4x4矩阵),需要找到下面方程的参数。我通常使用Excel求解器来求本构方程参数。但是这个方程中有9个不同的参数我想我需要用Matlab来做。你可以在附件中看到我在Excel中找到的结果。它不能捕捉曲线开始的凸起,它根本不是一个很好的拟合。你能给我一些提示如何构造代码吗?
压力= * (exp (m1 * T)) *(应变^ m2) * (sr ^ m3) * (exp (m4 /应变))*((1 +应变)^ m5 * T) * (exp (m7 *应变))* (sr ^ m8) * (T ^ m9)
A,m1,m2,m3,m4,m5,m7,m8,m9是我要找的参数。T=温度,sr=应变率
先谢谢你,
6个评论
亚历克斯·沙
亚历克斯·沙 2023年1月29日
您原来的拟合公式可以简化为如下,拟合效果相同,但参数少,参数值稳定:
原件:
压力= * (exp (m1 * T)) *(应变^ m2) * (sr ^ m3) * (exp (m4 /应变))*((1 +应变)^ m5 * T) * (exp (m7 *应变))* (sr ^ m8) * (T ^ m9);
简化:
压力= *(应变^ m2) * (exp (m4 /应变))*((1 +应变)^ m5 * T) * (exp (m7 *应变));
前四个数据集的结果如下(对于简化拟合函数,忽略第一个strain = 0的数据点):
1: 1000 c - 0.15 - sr
总和平方误差(SSE): 23.6730174432142
均方误差(RMSE): 0.769301914777518
相关系数。(R): 0.982032567779678
r平方:0.964387964179949
参数最佳估计
--------- -------------
一个0.16791350361708
平方米0.267072305431708
m40.0011468937880592
m5-6.60477948264248
m73.61825264240761
2: 1100 c - 0.15 - sr
总和平方误差(SSE): 20.0468246994224
均方误差(RMSE): 0.70793404882486
相关系数。(R): 0.979615018206333
r平方:0.959645583895393
参数最佳估计
--------- -------------
一个0.132995979333497
平方米0.32434785420116
m40.00111417690433741
m5-7.90718730551637
m74.31198101497506
3: 1200 c - 0.15 - sr
总和平方误差(SSE): 7.83639177584002
均方误差(RMSE): 0.442616983853987
相关系数。(R): 0.987336715319379
r平方:0.974833789417659
参数最佳估计
--------- -------------
一个0.0474196228353134
平方米0.109565052679149
m4-0.00306254669951433
m5-4.37704958424755
m72.31591332215742
4: 900 c - 1.5 - sr
总和平方误差(SSE): 52.3830536945957
均方误差(RMSE): 1.14436722356283
相关系数。(R): 0.996039729733376
r平方:0.992095143207337
参数最佳估计
--------- -------------
一个0.389573406540817
平方米0.47858711583706
m40.00828239426004025
m5-3.24842781707287
m70.594709755492173

登录评论。

接受的答案

Bjorn Gustavsson
Bjorn Gustavsson 2023年1月27日
编辑:Bjorn Gustavsson 2023年1月27日
对于这类问题,我会用 lsqnonlin ,所以请阅读该函数的帮助和文档,以及您还需要做些什么。大多数时候我会这样做(未经测试和编写):
函数residuals = res_straains_fcn (pars,T_obs, straain_obs,stress s_obs)
%压力= * (exp (m1 * T)) *(应变^ m2) * (sr ^ m3) * (exp (m4 /应变))*((1 +应变)^ m5 * T) * (exp (m7 *应变))* (sr ^ m8) * (T ^ m9)
%, m1, m2, m3, m4、m5, m7、m8, m9
A = pars(1);
M = pars(2);
Sr = 12;那一个不太明显,它应该是什么…
iT =数字(T):-1:1
iS = number (strain_obs):-1:1
stress_mod (,) = * (exp (m T (1) * ())) * (strain_obs(是)^ (2))* (sr ^ m (3)) *...
(exp (m (4) / strain_obs ())) * ((1 + strain_obs(是))^ T m (5) * ()) *...
(exp (m (6) * strain_obs ())) * (sr ^ m (7)) * (T (iT) ^ (8));
结束
结束
残差=应力s_obs -应力s_mod;
结束
这适用于以下情况:一个温度数组T_obs,大小为[nT x 1]或[1 x nT];一个应变数组straain_obs,大小为[nS x 1]或[1 x nS];一个观察到的应力数组,应力s_obs,大小为[nT x nS]。如果你的观测值相似,修改应该是相当明显的,函数应该只是计算所有观测值的模型应力。
然后优化调用将是这样的:
加载温度、应力和应变数据
将它们放入变量T_obs, straain_obs, stress s_obs或更改
%以下的名称到您使用的名称。
%参数的初始猜测(我不知道,你应该有一个好的/好的想法)
par0 = [A_best_guess m1_b_g、m2_b_g m3_b_g, m4_b_g, m5_b_g, m7_b_g, m8_b_g, m9_b_g);
[best_pars,[X,res_n,应力s_residuals,exFlag] = lsqnonlin(@(pars) res_straains_fcn (pars,T_obs, straain_obs,应力s_obs),...
par0);
如果你在exFlag中得到一个不同于1的值(可能是2或3)
% are OK),特别是如果它是0,那么你可以继续搜索:
[best_pars,[X,res_n,应力s_residuals,exFlag] = lsqnonlin(@(pars) res_straains_fcn (pars,T_obs, straain_obs,应力s_obs),...
best_pars);
如果你能定义一些参数的上界和下界,那么
%这可能有助于试衣(很大,非常大,?)
LB = par0-27;不是一个严肃的建议,你必须设置这些为基础。
LB(3) = -inf;%您的专业知识,-inf表示无限制地趋向于小值
UB = par0*3;不是一个严肃的建议,你必须设置这些为基础。
UB(5) = inf;%您的专业知识,-inf表示无限制地趋向于小值
[best_pars,[X,res_n,应力s_residuals,exFlag] = lsqnonlin(@(pars) res_straains_fcn (pars,T_obs, straain_obs,应力s_obs),...
par0磅,乌兰巴托);
如果你也有值得信任的标准差你应该用它们来得到适当的加权残差。
HTH
1评论
马特·J
马特·J 2023年1月27日
但首先,我将做一个线性拟合log(压力)作为一个简单的初始猜测。

登录评论。

更多答案(0)

世界杯预选赛小组名单社区寻宝

在MATLAB Central中找到宝藏,并发现社区如何帮助您!世界杯预选赛小组名单

开始狩猎!

Baidu
map