longlongyang 发表于 2009-2-23 11:01:34

如何在多步运算中产生积分函数表达式(matlab)

本帖最后由 longlongyang 于 2009-2-23 11:03 编辑

大家都知道用quadl(fun,a,b)积分,fun需要是函数表达式(函数句柄),一般我们用inline函数来创建一个函数表达式或者自己写的subroutin函数,然后调用这个函数表达式。例如,对x^2+5积分,先用inline函数创建函数表达式,fa=inline('x^2+5'), 然后fb=quadl(fa,a,b)求积分。但是,如果x^2+5是通过计算求出来的,例如,
fa=x+1;
fb=x^2+1;
fc=fa+fb;

如果现在想要对fc求数值积分(用quadl),该怎么写呢?因为我在程序运算的过程中并不知道fc究竟等于多少,所以不能直接inline('x^2+x+2')来创建函数表达式。请问这种问题该怎么解决呢 ?

debateshang 发表于 2009-2-23 12:51:37

function fc=fcc(x)
fc=fa(x)+fb(x);
% fa
function fa=fa(x)
fa=x+1;
% fb
function fb=fb(x)
fb=x.^2+1;

建立一个函数fcc,然后在命令行quadl(@fcc,0,1)这样实现可不可以?

longlongyang 发表于 2009-2-23 22:24:50

对不起,我没有把我的问题描述清楚。其实这个问题应该是参数传递然后产生新的函数表达式的问题。比如,在主程序中我有一个参数t=1:1001; 然后我要积分quadl(@(x)fun(x,t),0,1), 由于大家都知道matlab的数值积分是不能带符号的,也就是matlab并不会主动赋值给t, 如果运行的话matlab一般会提示''t is undefined'. 这个时候我们需要用feval给这个函数赋上t的值(e.g. fa=feval(@fun,x,t)),然后fa才只含有x一个变量其他都是数值。现在就可以对fa用quadl进行数值积分了,但是fa并不是一个函数表达式,而是一个变量,如何把fa转换成一个函数表达式从而可以进行quadl数值积分呢??

rocwoods 发表于 2009-2-24 00:09:51

楼主没有仔细研究二楼的方法,比较复杂的函数可以那样,还可以利用nested function
我记得以前我发过类似的帖子。
如果表达式不甚复杂的话,这里给你一个用匿名函数的例子y = @(t) quadl(@(x) x.^2 + t ,0,1);对于不同的t,比方说t = 1,t = 2
求表达式的值y(1),y(2)即可

longlongyang 发表于 2009-2-25 09:39:06

本帖最后由 longlongyang 于 2009-2-25 22:20 编辑

Thanks Rocwoods!

内嵌函数可以解决参数传递的问题,不过它必须都得是函数(function), 它并不能用在脚本里面。我的这个问题是被积分的函数含有多个参数,这些参数必须要在脚本里面赋值,因为这些值都是变化的,每一个循环赋一个值,匿名函数好像可以,不过我的公式还是很复杂的,参数也较多,不确定可不可以解决...

能跟高手rocwoods多学习,真是受益匪浅!!

longlongyang 发表于 2009-2-25 22:28:21

归根到底就是要用quadl积分,但要先产生函数句柄(function handle), 句柄当中不能含有符号,所以要先用feval函数赋值给这些参数符号,而且赋值过程要在脚本里进行而不能在函数里,因为脚本每运行一个循环会产生一个值给这些参数符号。 问题是用feval赋完值以后如果产生函数句柄?

rocwoods 发表于 2009-2-25 23:53:35

楼主把你的问题简化一下,给个具体的例子,感觉你说的赋值过程不能在函数里只能脚本比较奇怪。
页: [1]
查看完整版本: 如何在多步运算中产生积分函数表达式(matlab)