【求助】关于一个数值积分的问题
mathematica吧
全部回复
仅看楼主
level 8
zuoyangkill 楼主
本人菜鸟一枚,MMA纯属没事瞎玩。昨天有同事想算一个积分,我自然乐意相助(因为感觉MMA解这样的问题不是很难),可是,算是算出来了,是否正确就不清楚了....因为有人用matlab 也计算了一个数值,与我的计算结果相差很大。因为自己对matlab一窍不通,MMA也没自信,因此,特意想让吧里的“吧友(玩友们)”帮助指导指导。
我的代码如下:
Clear["Global`*"]
f[x_] := 1/(\[Pi] (a + x) (b + x) ((a + x)/(
b + x) + (b + x)/Sqrt[(a + x)^2 - (b + x)^2]
Log[(a + x)/(b + x) + Sqrt[(a + x)^2/(b + x)^2 - 1]])) /. {a ->
0.68, b -> 0.33}
NIntegrate[f[x], {x, 0, 0.02}]
Clear["Global`*"]
计算结果:0.00974779
同事用的matlab 计算出来结果是 0.0078392
~~~~误差真的比较大啊!!
我开始以为是方法的问题 误差比较大
又用了复合梯形、吉普森、龙贝格之类的方法(当然是资料里找的),但误差并没有太高,
希望,吧里的吧友们能帮帮忙~~[乖],如果更有兼通Matlab的吧友,希望也帮忙计算一下,给予解惑~~~[憧憬]
2014年08月08日 00点08分 1
level 9
算式中的Log是以10为底还是以e为底?mathematica默认是以e为底的,即自然对数。改成10为底之后,数值是0.00902806。你看一下matlab里的积分算式是不是对的,也许输错了什么的。
2014年08月08日 03点08分 2
是e为底的,您算出来e为底的结果是多少啊[乖]
2014年08月08日 03点08分
可是 我换成10为底后,结果是0.011514??是不是 哪里出错了啊[泪]
2014年08月08日 03点08分
回复 zuoyangkill :Log[a,b],以b为底
2014年08月08日 04点08分
回复 zuoyangkill :10为底的话是0.00902806
2014年08月08日 04点08分
level 9
如果输入格式无误的话,应该对mathematica有信心啊。你可以这样,把f[x]的数值从x=0到x=0.02输出若干个,matlab也一样,看看相同不。
2014年08月08日 03点08分 3
好,我再让她试试[呵呵]~
2014年08月08日 03点08分
查出来什么问题吗?
2014年08月08日 05点08分
回复 Song_20xx :她霸气的甩了我一句“老娘先忙完这一阵~”[啊] 看来今天她比较忙吧~~[无语]
2014年08月08日 05点08分
吧务
level 12
特地开MATLAB跑了下,结果如下图,所以多半是你那同事输错式子了
就我目前的经验来看,Mathematica和MATLAB在这种基础的运算上出现矛盾的时候,问题出现在人身上的概率是最大的…………
2014年08月08日 09点08分 4
最后一句顶
2014年08月08日 15点08分
谢谢啦~[哈哈] 其实我也大概估计是这个结果,但由于自己资历浅,学位不高,不会matlab总是不能让人信服[呵呵],毕竟自由的学术氛围并不是哪里都有~~感谢吧友们热情帮助[真棒],希望她也能发现问题所在
2014年08月08日 22点08分
这个是她的程序 a=input(*input a:*); b=input(*input b:*); syms x; F=int(1/(pi*(a+x)*(b+x)*((a+x)/(b+x)+(b+x)/sqrt((a+x)^2-(b+x)^2))*log((a+x)/(b+x)+sqrt((a+x)^2/(b+x)^2-1))),... x,0,0.02); FU=vpa(F,8)
2014年08月14日 04点08分
另外,她想知道式子里的点乘和点除是怎么用的~~[勉强]麻烦啦~~![乖]! F=inline(1/(pi*(a+x)*(b+x)*((a+x)/(b+x)+(b+x)/sqrt((a+x).^2-(b+x).^2))*log((a+x)/(b+x)+sqrt((a+x).^2/(b+x).^2-1)))); quad(F,0,0.02)
2014年08月14日 04点08分
吧务
level 12
你同事算的式子:1/(pi*(a+x)*(b+x)*((a+x)/(b+x)+(b+x)/sqrt((a+x)^2-(b+x)^2))*log((a+x)/(b+x)+sqrt((a+x)^2/(b+x)^2-1))
在MATLAB里用latex函数转化成latex代码,然后用WinEdt编译出来,是这样的
而你算的式子是这样的
括号括的地方都不一样好吗…………
而且看上面那个式子从对称性上明显比下面这个舒服,所以我感觉抄错表达式的多半是你…………
改完以后结果就一样了
顺便这也是为什么我觉得Mathematica用着比MATLAB舒服的原因之一,MATLAB的算式除非费半天劲转成latex形式,否则看着实在太费劲,尤其括号一多根本看不过来;而Mathematica就可以通过StandardForm很清楚地查看,省了好大事
至于MATLAB里的点乘点除,可以参考这个回答:
http://zhidao.baidu.com/link?url=XtDQHPwYhxIujvksdeVJ6hoqy7d2-0YUUz-ajYnKfqkGLEQ9Bo9doY0qy3KnGOO_My6oN-_hPlew3buUUGTs6_
里面说的挺清楚地
2014年08月14日 06点08分 5
谢谢您啦~[哈哈],式子确实是她抄错了,呵呵[太开心]~~确实括号一多,表达式不易看清的,我从MMA入手也是看重它的符号简洁~~多亏了吧里朋友帮助,找出问题,否则我们还在纠结错在哪里呢~
2014年08月14日 06点08分
1