[示例] 关于带参数的积分问题
有不少人常问带参数的积分问题该如何处理,现举一个例子,希望能起到抛砖引玉的作用.%%%-------------------------------------------------------%%%
例如以下问题:
函数为 y=sin(k.*x).*x.^2,对x积分,
积分区域为【1,5】,目的是要画 k 和 y 的图形.
%%%==============================%%%
%%% 作k的一个循环, k作为 inline函数的参数即可.
clear all
k=linspace(0,5);
for i=1:length(k)
kk=k(i);
fun=strcat('sin(',num2str(kk),'*x).*x.^2');
y(i)=quadl(inline(fun),1,5);
end
plot(k,y)
%%%==============================%%%
==========================================
注意: 这个程序的特别意义在于,对于任何复杂的、无显式积分表达式的
带参数积分问题具有通用性,我主要是针对此而写的。
==========================================
[ 本帖最后由 xjzuo 于 2007-5-10 15:38 编辑 ]
clear all
k=linspace(1,5);
for i=1:length(k)
kk=k(i);
fun=['sin(',num2str(kk),'*x).*x.^2'];
y(i)=quadl(inline(fun),1,5);
end
plot(k,y)
clear all
k=linspace(1,5);
for i=1:length(k)
kk=k(i);
fun=inline(subs('sin(k*x)*x^2','k',kk));
y(i)=quadl(fun,1,5);
end
hold on;
plot(k,y,'r')
响应xjzuo的号召,我也来两种办法,第一种是利用匿名函数(Anonymous Function),第二种是利用内嵌函数(Nested Function)
方法一:
clear all
kk=linspace(0,5);
y=zeros(size(kk));
ff=@(k) ['sin(',num2str(k),'*x).*x.^2'];
f=@(k) quadl(ff(k),1,5);
for ii=1:length(kk)
y(ii)=f(kk(ii));
end
plot(kk,y)
方法二:
新建m文件
function y=shuzhijifen(k)
function f=f(x)
f=sin(k.*x).*x.^2;
end
y=quadl(@f,1,5);
end
保存之,然后运行
clear all
kk=linspace(0,5);
y=zeros(size(kk));
for ii=1:length(kk)
y(ii)=shuzhijifen(kk(ii));
end
plot(kk,y) 有点意思,不错,得好好研究一下
这个问题挑战性太小,可以先求出积分,再画曲线
如果把问题改成这样呢:
y=sin(k.*x).*x.^2,对x积分,然后在积分区域【1,5】上画x 和 y 的图形?
[ 本帖最后由 ChaChing 于 2010-6-20 00:38 编辑 ] 希望qhdhfcy 能了解我写这个示例程序的本意所在.
该程序的威力不在于本例,而在于求解那些无显式积分的问题.
另:你说的"y=sin(k.*x).*x.^2,对x积分,然后在积分区域【1,5】上画x 和 y 的图形"似乎有问题,既然已经对x积分,你还能画出x 和 y 的图形? 原帖由 qhdhfcy 于 2007-5-10 15:04 发表
这个问题挑战性太小,可以先求出积分,再画曲线
如果把问题改成这样呢:
y=sin(k.*x).*x.^2,对x积分,然后在积分区域【1,5】上画x 和 y 的图形?
xjzuo版主发这个帖的目的是希望大家一起完善下“带参数的积分问题”的求解方法,为了描述问题方便只是简单举了这个函数作为例子。 明白了,原来误解大家的意思了,请多见谅啊 好,不错 。
谢谢,支持一下。:lol 再补充两个方法,形式更加简单了。
方法一(用循环):f=@(k) quad(@(x)sin(k.*x).*x.^2,0,5)
kk=linspace(0,5);
y=zeros(size(kk));
for ii=1:length(kk)
y(ii)=f(kk(ii));
end
plot(kk,y)
方法二(不用循环):plot(linspace(0,5),arrayfun(@(k) quad(@(x)sin(k.*x).*x.^2,0,5),linspace(0,5)))
建议大家不知道arrayfun这个函数的,到帮助里查查它的用法,很好用的。
[ 本帖最后由 rocwoods 于 2007-8-30 14:07 编辑 ] @什么意思?问楼上!!!
了解到了:表示 f是一个函数,返回值是函数的句柄!但是想知道函数的句柄是什么概念?
[ 本帖最后由 ChaChing 于 2010-6-20 00:40 编辑 ] 原帖由 caichengtao 于 2007-9-2 20:32 发表
@什么意思?问楼上!!!
匿名函数 或者 函数的句柄
相当于其他语言的“指针”
[ 本帖最后由 ChaChing 于 2010-6-20 00:43 编辑 ] 强顶此贴,要是早点看到,节省了我不少时间啊 好贴,学习了!看到楼主的帖子,让我深受启发,把符号运算改成数值运算(积分),计算时间节省到以前的1/20!,希望楼主多多发贴啊 顶,我觉得要是用inline可能会方便 例子好精彩啊,能不能给个二重积分的例子啊