dty7611477 发表于 2009-8-18 10:06:44

上下限为符号表达式的积分求助

本帖最后由 messenger 于 2009-8-25 23:24 编辑

大家好,我需要算一个积分,可是可能太复杂或是没有原函数,int命令求不出来,想用数值积分,像quad,或是combinetraprl,intgauss等,但是这些数值积分命令都是对具体数值积分,而我要求的上下限是a到b,而且a,b是符号表达式,希望最后结果能得到一个带参数的表达式,求出表达式,建立目标函数优化。不知道怎么办,因为目标函数建立不了我就没法进行下一步,希望有人能帮我,谢谢
下面是我求积分的一段程序
syms th L1 L2 L3 L4 y x
d=2*L2*(L1*sin(th)-y);
e=2*L2*(L1*cos(th)+x);
f=(L1*cos(th)+x)^2+(L1*sin(th)-y)^2+L2^2-L3^2;
th2=atan((sqrt(d^2+e^2-f^2)+d)/(e-f));
a=2*L3*(y-L1*sin(th));
b=-2*L3*(x+L1*cos(th));
c=L3^2-L2^2+(y-L1*sin(th))^2+(x+L1*cos(th))^2;
th3=atan((sqrt(a^2+b^2-c^2)+d)/(b-c));
th4=acos(-L3*cos(th3)/L4);
T=L1*cos(th)+L2*cos(th2)*((L1*cos(th)*sin(th3)-L1*sin(th)*cos(th3))/L2*sin(th2-th3))...
+L4*sin(th3)*cos(th4)*((L1*cos(th)*sin(th2)-L1*sin(th)*cos(th2))/(sin(th3-th2)*L4*sin(th4)));
F=int(T,'th')
结果 没找原函数
这几天一直在论坛上,实在不知道怎么办,还望高手指点!!

rocwoods 发表于 2009-8-18 10:56:48

搜一下本版吧,类似的问题讨论过很多次了。我记得我就给出过利用匿名函数、nested function等解决办法。

dty7611477 发表于 2009-8-18 11:59:24

2# rocwoods

版主帮帮忙吧
我这急用
没找到
帮帮解决一下

dty7611477 发表于 2009-8-18 13:27:01

本帖最后由 dty7611477 于 2009-8-18 14:00 编辑

2# rocwoods
我的目标函数特点:
1、积分的原函数找不到
2、积分上下限含有要优化的变量,不是数值
真的很郁闷,版主帮我想想办法啊
不胜感激!

rocwoods 发表于 2009-8-18 17:45:10

本帖最后由 rocwoods 于 2009-8-18 17:47 编辑

你遇到的问题是本质是参数传递问题。
MATLAB求优化,需要把初始值传进优化目标函数里去,当待优化的函数没有显示表达式时,你估计不清楚如何写出待优化的函数,并且怎样传递初始值给它。
其次,积分上下限非数值的积分问题,这个可以用匿名函数以及nested function很方便的实现。你需要的是例子。给你三个帖子。你把这三个帖子吃透,你的问题就迎刃而解了。
自己学习琢磨来的印象要深得多。祝你好运!
http://www.chinavib.com/forum/thread-42369-1-1.html(注意看我14楼的回复)
http://forum.simwe.com/viewthread.php?tid=797984&highlight=
http://www.chinavib.com/forum/thread-83587-1-13.html

dty7611477 发表于 2009-8-19 16:25:22

本帖最后由 dty7611477 于 2009-8-19 19:43 编辑

5# rocwoods
前辈啊
首先感谢你的抽出时间给我找到相关的帖子,本人也仔细的拜读了。可是不知道哪里存在问题,还是没有结果。我感觉你是这块的权威了,能否抽点时间帮我看看是什么原因。
由于我文件比较大
能不能留下qq
myqq:362811515

dty7611477 发表于 2009-8-20 08:42:58

本帖最后由 dty7611477 于 2009-8-20 08:53 编辑

6# dty7611477
function y=opt_fun(x)
%求积分上限
function th_x=shang(x)
s=x(3)+x(4);
th3=-asin((x(3).^2-x(4).^2+s.^2)./(2*s.*x(3)));
g=-2*x(1).*(x(6)+x(3).*sin(th3));
h=-2*x(1).*(x(5)+x(3).*cos(th3));
k=x(3).^2+x(1).^2+2*x(3).*x(5).*cos(th3)+2*x(3).*x(6).*sin(th3)+x(5).^2+x(6).^2-x(1).^2;
th_x=2*atan((sqrt(d^2+e^2-f^2)+d)/(e-f));
end
%求积分下限
function th_6=xia(x)
s=x(3)+x(4)-0.006;
th3=-asin((x(3).^2-x(4).^2+s.^2)./(2*s.*x(3)));
gg=-2*x(1).*(x(6)+x(3).*sin(th3));
hh=-2*x(1).*(x(5)+x(3).*cos(th3));
kk=x(3).^2+x(1).^2+2*x(3).*x(5).*cos(th3)+2*x(3).*x(6).*sin(th3)+x(5).^2+x(6).^2-x(1).^2;
th_6=2*atan((sqrt(d^2+e^2-f^2)+d)/(e-f));
end
%被积函数
function T=t(th)
d=2*x(2).*(x(1).*sin(th)-x(6));
e=2*x(2).*(x(1).*cos(th)+x(5));
f=(x(1).*cos(th)+x(5)).^2+(x(1).*sin(th)-x(6)).^2+x(2).^2-x(3).^2;
th2=2*atan((sqrt(d.^2+e.^2-f.^2)+d)./(e-f));
a=2*x(3).*(x(6)-x(1).*sin(th));
b=-2*x(3).*(x(5)+x(1).*cos(th));
c=x(3).^2-x(2).^2+(-x(1).*sin(th)).^2+(x(5)+x(1).*cos(th)).^2;
th3=2*atan((sqrt(a.^2+b.^2-c.^2)+d)./(b-c));
th4=acos(-x(3).*cos(th3)./x(4));
%T是最终的被积函数,上面是th2,th3,th4关于th的函数,要对th积分
T=x(1).*cos(th)+(x(1).*sin(th3-th).*sin(th4).*cos(th)-x(1).*sin(th2-th).*sin(th3).*sin(th4))./(sin(th2-th3).*sin(th4));
end
%数值积分
y=quadl(@t,xia(x),shang(x));
end
:)

dty7611477 发表于 2009-8-20 22:53:16

5# rocwoods
大侠啊
本人实在不好意思一直打搅,可这个问题能力实在有限,望前辈伸出援手,指条明路,
我的原题已经发上去,帮帮忙看看吧

rocwoods 发表于 2009-8-21 02:30:16

你好,你的问题需要有相应的背景知识,这样有助于大家理解,同时,应该描述清楚你遇到什么问题,出错信息等等。这段时间本人精力有限,工作很忙,实在没有大片的时间考虑你的问题。只能给你一些方向。磨刀不误砍柴工,建议你还是把我给你的那些链接的内容完全看明白,就是nested function和匿名函数使用问题,看你写的代码,还没有掌握。

dty7611477 发表于 2009-8-22 10:56:36

9# rocwoods

数值积分时上下限的调用不知道对错
忘版主和高手指点
y=quadl(@t,@xia,@shang);

y=quadl(@t,xia(x),shang(x));
页: [1]
查看完整版本: 上下限为符号表达式的积分求助