matlab警告imaginary,一种高质量拟合常微分方程参数的方法:低版本1stOpt和MATLAB联用...

0.引言

就方程参数拟合问题而言,常见非线性方程(组)参数拟合和常微分方程(组)参数拟合两种。

本帖主要讨论常微分方程参数的拟合问题。限于本人水平,存在纰漏甚至错误在所难免,欢迎大家批评指正,同时希望能抛砖引玉。

1.影响拟合质量的因素

Origin软件的Help文档总结了影响拟合质量的主要因素,总共5条,列出如下:

(1)参数初值

(2)模型(公式)的正确性或者适用性

(3)迭代计算的中止的判断指标高低

(4)数据点的充分性

(5)数据点的噪声

实际上,拟合算法的先进性同样影响拟合的质量,在此基础上,加上一条:

(6)算法先进与否及其适用性

本帖主要讨论第一个因素,即参数初值,对拟合质量的影响。在本体后续的讨论中可以看到,参数初值的选取,对最终拟合结果影响相当显著。

2.本帖讨论的例子出处

本帖讨论的例子出处见:http://muchong.com/bbs/viewthread.php?tid=7595881&fpage=1

直观起见,对上述例子中的问题表述如下:

已知自变量t,因变量y,y和t满足一下函数式:

dy/dt=0.001414/(1/(4.5727*10^4*k1*(1-0.02119*y)^k2)+1/k3/45727);(需要指出的是,该公式中参数可进一步合并,在本帖中并未作合并处理)

已知 t=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14];

y=[20.4122 22.73032 24.55624 25.88679 26.69019 27.16334 27.45866 27.64919 27.57615 27.70635 27.77303 27.86195 27.91911 27.95721 27.98897];

拟合出参数k1,k2,k3。

3.结果与讨论

运行MATLAB软件,调用lsqnonlin函数和ode45函数,参数初值按k1=k2=k3=1选取,程序代码如下:CODE:

function KineticsEst1_Int_modified_by_Yuezhilan

clear all;clc

format long

tspan=[31 32 33 34 35 36 37 38 39 40 41 42 43 44 45]-31;

yexp=[22.73032 24.55624 25.88679 26.69019 27.16334 27.45866 27.64919 27.57615 27.70635 27.77303 27.86195 27.91911 27.95721 27.98897]';

k0=[1 1 1];   %%%请注意这里,初值的选取

y0=20.4122;

lb=-[1 1 1]*1e3;

ub=[1e12 1000 1];

yy=[y0 yexp'];

[k,resnorm,residual,exitflag,output,lambda,jacobian] = ...

lsqnonlin(@ObjFunc,k0,lb,ub,[],tspan,y0,yexp);

fprintf('\n\n使用函数lsqnonlin()估计得到的参数值为:\n')

fprintf(

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 这是一个复数,实部为0,虚部为1.207418269725733e-06。在MATLAB中,复数用实部和虚部表示,可以使用以下方式表示: ``` z = 0 + 1.207418269725733e-06i ``` 或者使用以下方式: ``` z = 1.207418269725733e-06i ``` 如果要显示复数的实部和虚部,可以使用以下命令: ``` real(z) % 显示实部 imag(z) % 显示虚部 ``` ### 回答2: 在MATLAB中,0.000000000000000e 00表示一个非常接近于零的实数,即0。而1.207418269725733e-06i表示一个虚数,其中e表示10的幂次,即10的-06次方,i表示虚数单位。 我们可以使用MATLAB内置的复数运算功能来处理这个复数。要将实部和虚部分开,可以使用real()和imag()函数。例如,我们可以使用以下代码将给定复数分开: ```matlab z = 0.000000000000000e00 + 1.207418269725733e-06i; real_part = real(z); imaginary_part = imag(z); ``` 上述代码中,变量z表示给定的复数,real_part表示实部,imaginary_part表示虚部。通过执行以上代码,可以得到实部为0,虚部为1.207418269725733e-06的结果。 ### 回答3: 在MATLAB中,0.000000000000000e 00 1.207418269725733e-06i 是一个复数,实部为0.000000000000000,虚部为1.207418269725733e-06i。在MATLAB中,真实部分通常通过小写字母“r”表示,虚部通常通过小写字母“i”表示。所以,这个复数可以表示为0.000000000000000r + 1.207418269725733e-06i。 复数可以用多种方式表示。下面是一些用于展示和处理该复数的MATLAB代码示例: ```matlab % 声明复数 z = complex(0.000000000000000, 1.207418269725733e-06); % 打印复数 disp(z); % 打印实部和虚部 disp(real(z)); disp(imag(z)); % 打印幅值和相位 disp(abs(z)); disp(angle(z)); ``` 这段代码首先创建了一个名为“z”的复数变量,其中实部为0.000000000000000,虚部为1.207418269725733e-06。然后,代码分别打印了复数本身,实部,虚部,幅值和相位。 通过运行此代码,您可以将MATLAB中的0.000000000000000e 00 1.207418269725733e-06i复数以各种方式展示出来。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值