找回密码
 注册
Simdroid-非首页
查看: 71|回复: 3

符号矩阵 数值积分 函数句柄

[复制链接]
发表于 2009-6-11 07:57:58 | 显示全部楼层 |阅读模式 来自 德国
刚刚看到多朋友也有一个更我一样的难题,就是较大的符号矩阵的积分问题,高了好几天,真的是到了瓶颈了,所以把我写的些码拿出来大家一起讨论讨论,互相学习,不多说了看看这段码,
......
        fstr=Kstr(zeile,spalte); Kstr是一个符号矩阵,
         fstr = char(fstr);         变为字符
        fstr=strrep(fstr,'*','.*');  变点×
        fstr=strrep(fstr,'/','./');  。。。
        fstr=strrep(fstr,'^','.^');  。。。。
        %myfhandle = @(phi)myfunchandle(fstr,phi);
        myfhandle = @(phi)fstr;
        %myfhandle=inline(char(fstr));
        %myfhandle=myfunchandle(fstr,phi)
        %elestr=str2func(char(fstr));
        %myfhandle=matlabFunction(fstr,'vars',[phi])
        q1=quad(@myhandle,0,phi_limit,0.1);
        K(zeile,spalte)=q1;

在这里我简单吧那个fstr,就是Kstr中的一项给大家,以便讨论,不过很长
fstr =
(2*3100000000*sin(conj(2)*conj(phi))*log(6/5)*sin(2*phi))/25+(2*6700000000*2*cos(conj(2)*conj(phi))*log(5/6)*cos(2*phi)*conj(2))/(25*((6700000000*0.04^2)/2780000000+(890000000*0.17^2)/6700000000+(890000000*0.08^2)/2780000000+(890000000*0.04*0.17*0.08)/2780000000+(890000000^2*0.04*0.17*0.08)/2780000000^2-1))+(2*6700000000^2*2780000000*890000000*2*0.08^2*cos(conj(2)*conj(phi))*log(6/5)*cos(2*phi)*conj(2))/(25*(6700000000*(2780000000*890000000*0.08^2-2780000000^2+0.04*0.17*2780000000*890000000*0.08+0.04*0.17*890000000^2*0.08)+6700000000^2*2780000000*0.04^2+2780000000^2*890000000*0.17^2))



ok,问题就是,我用了几种不同的方法得到函数句柄,进行积分,最后却得到两种不同结果,数值差很大,用inline和matlabfunction得到一样的结果,而且结果貌似是对的,但是速度慢,如果用@隐函数和内敛函数就是另外一个,他两是一样的,跟另外一个答案差了,1e8数量级,但是速度很快,我搞不清楚的是为什么会在相同的句柄的情况下会积分出不同的结果,希望大家一起讨论,交流
发表于 2009-6-11 09:45:44 | 显示全部楼层 来自 北京朝阳
Simdroid开发平台
楼主doc一下 vectorize函数,看看其用法,然后把代码修改下。看看inline和匿名函数的结果
另外,inline结构已经不推荐使用了。inline可以实现的功能,匿名函数都可以,而且更好更强大得多。
回复 不支持

使用道具 举报

 楼主| 发表于 2009-6-11 18:50:53 | 显示全部楼层 来自 德国
本帖最后由 8lu 于 2009-6-11 18:57 编辑

先谢版主了,问题是如果我匿名函数的话结果感觉不对,代码如下
fstr=Kstr(zeile,spalte); Kstr是一个符号矩阵,
         fstr = char(fstr);         变为字符
        fstr=strrep(fstr,'*','.*');  变点×
        fstr=strrep(fstr,'/','./');  。。。
        fstr=strrep(fstr,'^','.^');  。。。。
         myfhandle = @(phi)fstr;
         q1=quad(@myfhandle,0,phi_limit,0.1);
        K(zeile,spalte)=q1;

phi_limit=2*pi,不知道是哪里的问题,
而用这个代码,得到的结果就好很多
        myfhandle=matlabFunction(fstr,'vars',[phi])
        q1=quad(@myhandle,0,phi_limit,0.1);
结果为1.377e9左右,前面那个就只有283左右,不知道那里错了,
我再看看 vectorize函数
回复 不支持

使用道具 举报

 楼主| 发表于 2009-6-11 19:00:29 | 显示全部楼层 来自 德国
用了vectorize函数结果还是没什么改变,
        fstr = Kstr(zeile,spalte);
        fstr=vectorize(char(fstr))
        myfhandle = @(phi) fstr;
        q1=quad(@myhandle,0,phi_limit,0.1);
不知道是什么问题,
回复 不支持

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|小黑屋|联系我们|仿真互动网 ( 京ICP备15048925号-7 )

GMT+8, 2024-3-29 20:57 , Processed in 0.034705 second(s), 14 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表