24小时热门版块排行榜    

查看: 1851  |  回复: 1

ponder_zsm

新虫 (初入文坛)

[求助] 如何用给定的带有参数的函数拟合已知数据? 已有1人参与

已知实验数据和函数原型如下:
data = {{8.5, 0.828}, {12.5, 0.78}, {16.5, 0.741}, {20.4, 0.714}, {23.1, 0.66}, {29.4, 0.558}, {39.4, 0.491}, {49.4, 0.454}};
model = Integrate[(1 - x/r)^2*Exp[-(Log[r/b*Sqrt[1 + (a*a)/(b*b)]])^2/(2 Log[1 + (a*a)/(b*b)])]/(r*Sqrt[2*Pi*Log[1 + (a*a)/(b*b)]]), {r,0, Infinity}];
这是在Mathematica中输入的格式,函数原型可以参见上传的附件。其中a, b是参数,x是自变量。用Findfit求a和b时,Mathematica给出的结果不对:
{a -> 160.339, b -> 186.173}
合理值应该在a=299, b=247左右,在用所给值验证时,所得到的函数值为虚数:
f[a_, b_, x_, r_] :=Integrate[(1 - x/r)^2*Exp[-(Log[r/b*Sqrt[1 + (a*a)/(b*b)]])^2/(2 Log[1 + (a*a)/(b*b)])]/(r*Sqrt[2*Pi*Log[1 + (a*a)/(b*b)]]), {r,0, Infinity}];
f[160.339, 186.173, 8.5, r]
输出为:0.851972 - 4.76418*10^-15 I
不知道哪里可以改进,求高人指点!

另外我尝试用1st opt,但是也不成功:
Constant h=10000;
Parameters a,b;
Variables x,y;
Function y=int(sqr(1-x/r)*exp(-sqr(ln(r*sqrt(1+(a*a)/(b*b))/b))/(2*ln(1+(a*a)/(b*b))))/(r*sqrt(2*Pi*ln(1+(a*a)/(b*b)))),r=0,h);
Data;
8.5 0.828
12.5 0.78
16.5 0.741
20.4 0.714
23.1 0.66
29.4 0.558
39.4 0.491
49.4 0.454
提示函数表达式错误!求指点!!

如何用给定的带有参数的函数拟合已知数据?
函数.png
回复此楼

» 猜你喜欢

» 本主题相关价值贴推荐,对您同样有帮助:

已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

xzczd

木虫 (小有名气)

【答案】应助回帖

楼主你确定真值在{a->299, b->247}附近?

下图是{a -> 160.339, b -> 186.173}时的拟合效果图:
如何用给定的带有参数的函数拟合已知数据?-1
这拟合效果不算差。

下图是你给的参数对应的图:
如何用给定的带有参数的函数拟合已知数据?-2
囧。

然后,关于直接反代导致虚数的问题:这只是一点数值误差罢了,如你所见,虚部的值非常微小。想要避免这个问题,你可以把全体参数都改成准确值(也就是别用小数),也可以把Integrate改成NIntegrate然后再加个高一点的WorkingPrecision。
小木虫Mathematica版块已毁(当然原本也不咋的),建议大家前往百度贴吧或Stackexchange。
2楼2015-01-03 21:41:26
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 ponder_zsm 的主题更新
信息提示
请填处理意见