当前位置: 首页 > 计算模拟 >微分方程与代数方程联立,参数拟合问题求助

微分方程与代数方程联立,参数拟合问题求助

作者 ckm0811
来源: 小木虫 300 6 举报帖子
+关注

根据以下二式,利用最小二乘法拟合参数a,b,c,从而得到关于P的模型。
① P=a*[(lamb/x)^b/lamb-1/lamb*(x/lamb)^(0.5b)]
② dx/dt=(1/3/c)*a*[(lamb/x)^b-(x/lamb)^(0.5b)]
其中a,b,c为待求参数。试验数据lamb和P已知,其中lamb范围为[0.91,1]。x为中间变量。
目前不知该用什么函数实现上述目的,想请大家提供一些思路。

已写程序如下,中间一段代码思路应该有问题,但不知如何改正
clear,clc
close all
format long;
lamb=[1;0.995;0.99;0.985;0.98;0.975;0.97;0.965;0.96;0.955;0.95;0.945;0.94;0.935;0.93;0.925;0.92;0.915;0.91] %试验值lamb
p=[0;-0.0166845;-0.0293383;-0.0433058;-0.0591614;-0.0761656;-0.0933141;-0.1099259;-0.1258601;-0.1414556;-0.1572909;-0.1738675;-0.1913200;-0.2092681;-0.2269212;-0.243560;-0.2595227;-0.2778129;-0.3064931];   %试验数据P

%fac为未知数向量,其中元素fac(1)=a,fac(2)=b,fac(3)=c
%lambv即中间变量x
fun=@(fac,lamb,lambv)(fac(1)*((lamb./lambv)^fac(2)./lamb-(lambv./lamb).^(fac(2)*0.5)./lamb));
odefun=@(fac,lamb,lambv)(1/3/fac(3)*(fac(1)*((lamb./lambv)^fac(2)-(lambv./lamb)^(0.5*fac(2)))));
tspan=[0.9,1];
lambv0=1;
[fac,lambv]=ode45(odefun,tspan,lambv0,[]);
fac0=[0.5 0.15 1]; %a,b,c初值
%最小二乘法拟合abc
coefind=fminsearch(@(fac)((sum(p(:,1)-fun(fac,lamb,lambv)))^2),coeffia0,optimset('MaxFunEvals',1e10,'MaxIter',1e6));


%拟合后的理论模型
p_model=coefind(1)*((lamb./lambv)^b./lamb-1/lamb*(lambv./lamb)^(0.5b))
err1=100*(p-p_model)/p
figure('color',[1 1 1])
plot(lamb,p,'-o');  
hold on
plot(lamb,p_model,'--');
xlabel('主伸长率λ','fontsize',10);
ylabel('名义应力P1(Mpa)','fontsize',10); 返回小木虫查看更多

今日热帖
  • 精华评论
  • 独孤神宇

    一种方法是直接用哦的 ode15i 函数求解微分代数方程,然后用 非线性拟合函数 如lsqnonlin求解参数

    第二种方法,将代数方程求导转化为 微分方程,然后拟合微分方程组参数

  • ckm0811

    引用回帖:
    2楼: Originally posted by 独孤神宇 at 2021-07-12 21:35:54
    一种方法是直接用哦的 ode15i 函数求解微分代数方程,然后用 非线性拟合函数 如lsqnonlin求解参数
    第二种方法,将代数方程求导转化为 微分方程,然后拟合微分方程组参数
    ...

    您好,我尝试了用ode15i求解,将中间部分的程序改成为下面所示,出现了报错。用ode15i求解式2时,里面的系数abc是未知的,这样可以求解出来吗,感觉自己还是不太明白该怎么做。您空闲时可以帮忙看一下程序指点一下吗
    fun=@(fac,lamb,lambv)(fac(1)*((lamb./lambv)^fac(2)./lamb-(lambv./lamb).^(fac(2)*0.5)./lamb));
    odefun=@(lambv,xp,fac,lamb)(xp-(1/3/fac(3))*(fac(1)*((lamb./lambv)^fac(2)-(lambv./lamb)^(0.5*fac(2)))));
    tspan=lamb';
    lambv0=1;
    xp0=0;
    [t,lambv]=ode15i(odefun,tspan,lambv0,xp0);


    报错:
    索引超出数组元素的数目(1)。

    出错
    netBmodel2>@(lambv,xp,fac,lamb)(xp-(1/3/fac(3))*(fac(1)*((lamb./lambv)^fac(2)-(lambv./lamb)^(0.5*fac(2)))))

    出错 odearguments (line 90)
    f0 = feval(ode,t0,y0,args{:});   % ODE15I sets args{1} to yp0.

    出错 ode15i (line 118)
        odearguments(FcnHandlesUsed, solver_name, ode, tspan, y0,  ...

    出错 netBmodel2 (line 22)
    [t,lambv]=ode15i(odefun,tspan,lambv0,xp0);

  • 独孤神宇

    引用回帖:
    3楼: Originally posted by ckm0811 at 2021-07-13 16:31:45
    您好,我尝试了用ode15i求解,将中间部分的程序改成为下面所示,出现了报错。用ode15i求解式2时,里面的系数abc是未知的,这样可以求解出来吗,感觉自己还是不太明白该怎么做。您空闲时可以帮忙看一下程序指点一下 ...

    我看了一下,缺少 时间 t 对应的数据,这个没办法进行拟合的。

  • ckm0811

    引用回帖:
    4楼: Originally posted by 独孤神宇 at 2021-07-13 21:50:46
    我看了一下,缺少 时间 t 对应的数据,这个没办法进行拟合的。...

    刚看到您的回复,谢谢

  • ckm0811

    引用回帖:
    4楼: Originally posted by 独孤神宇 at 2021-07-13 21:50:46
    我看了一下,缺少 时间 t 对应的数据,这个没办法进行拟合的。...

    您好,我补充了时间数据,将数据和程序打包放在了压缩文件里,可以请您帮我看一下吗

  • ckm0811

    引用回帖:
    6楼: Originally posted by ckm0811 at 2021-07-19 21:40:24
    您好,我补充了时间数据,将数据和程序打包放在了压缩文件里,可以请您帮我看一下吗...

    链接: https://pan.baidu.com/s/1tC9MHP1l8a9bGkQVm8zRAA 提取码: rv3r
    几次上传附件都没有成功,只能用网盘链接了

猜你喜欢
下载小木虫APP
与700万科研达人随时交流
  • 二维码
  • IOS
  • 安卓