声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 1280|回复: 4

[编程技巧] 如何在多步运算中产生积分函数表达式(matlab)

[复制链接]
发表于 2016-10-9 11:06 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
大家都知道用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')来创建函数表达式。请问这种问题该怎么解决呢 ?
回复
分享到:

使用道具 举报

发表于 2016-10-9 11:07 | 显示全部楼层
  1. function fc=fcc(x)
  2. fc=fa(x)+fb(x);
  3. % fa
  4. function fa=fa(x)
  5. fa=x+1;
  6. % fb
  7. function fb=fb(x)
  8. fb=x.^2+1;
复制代码
建立一个函数fcc,然后在命令行quadl(@fcc,0,1)这样实现可不可以?
 楼主| 发表于 2016-10-9 11:07 | 显示全部楼层
对不起,我没有把我的问题描述清楚。其实这个问题应该是参数传递然后产生新的函数表达式的问题。比如,在主程序中我有一个参数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数值积分呢??
发表于 2016-10-9 11:08 | 显示全部楼层
楼主没有仔细研究二楼的方法,比较复杂的函数可以那样,还可以利用nested function
我记得以前我发过类似的帖子。
如果表达式不甚复杂的话,这里给你一个用匿名函数的例子
  1. y = @(t) quadl(@(x) x.^2 + t ,0,1);
复制代码
对于不同的t,比方说t = 1,t = 2
求表达式的值y(1),y(2)即可
 楼主| 发表于 2016-10-9 11:09 | 显示全部楼层
内嵌函数可以解决参数传递的问题,不过它必须都得是函数(function), 它并不能用在脚本里面。我的这个问题是被积分的函数含有多个参数,这些参数必须要在脚本里面赋值,因为这些值都是变化的,每一个循环赋一个值,匿名函数好像可以,不过我的公式还是很复杂的,参数也较多,不确定可不可以解决...


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

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-3-29 15:34 , Processed in 0.943623 second(s), 21 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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