xjzuo 发表于 2007-5-9 17:41

[示例] 关于带参数的积分问题

有不少人常问带参数的积分问题该如何处理,现举一个例子,希望能起到抛砖引玉的作用.
%%%-------------------------------------------------------%%%
例如以下问题:
函数为 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 编辑 ]

shunfly 发表于 2007-5-9 19:22


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')

rocwoods 发表于 2007-5-9 23:27

响应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)

qhdhfcy 发表于 2007-5-10 15:04

有点意思,不错,得好好研究一下
这个问题挑战性太小,可以先求出积分,再画曲线
如果把问题改成这样呢:
y=sin(k.*x).*x.^2,对x积分,然后在积分区域【1,5】上画x 和 y 的图形?

[ 本帖最后由 ChaChing 于 2010-6-20 00:38 编辑 ]

xjzuo 发表于 2007-5-10 15:44

希望qhdhfcy 能了解我写这个示例程序的本意所在.
该程序的威力不在于本例,而在于求解那些无显式积分的问题.

另:你说的"y=sin(k.*x).*x.^2,对x积分,然后在积分区域【1,5】上画x 和 y 的图形"似乎有问题,既然已经对x积分,你还能画出x 和 y 的图形?

rocwoods 发表于 2007-5-10 16:49

原帖由 qhdhfcy 于 2007-5-10 15:04 发表
这个问题挑战性太小,可以先求出积分,再画曲线
如果把问题改成这样呢:
y=sin(k.*x).*x.^2,对x积分,然后在积分区域【1,5】上画x 和 y 的图形?
xjzuo版主发这个帖的目的是希望大家一起完善下“带参数的积分问题”的求解方法,为了描述问题方便只是简单举了这个函数作为例子。

qhdhfcy 发表于 2007-5-10 16:49

明白了,原来误解大家的意思了,请多见谅啊

chbo76 发表于 2007-6-8 23:04

好,不错 。
谢谢,支持一下。:lol

rocwoods 发表于 2007-8-30 14:04

再补充两个方法,形式更加简单了。
方法一(用循环):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 编辑 ]

caichengtao 发表于 2007-9-2 20:41

@什么意思?问楼上!!!
了解到了:表示 f是一个函数,返回值是函数的句柄!但是想知道函数的句柄是什么概念?

[ 本帖最后由 ChaChing 于 2010-6-20 00:40 编辑 ]

eight 发表于 2007-9-2 21:17

原帖由 caichengtao 于 2007-9-2 20:32 发表
@什么意思?问楼上!!!
匿名函数 或者 函数的句柄
相当于其他语言的“指针”

[ 本帖最后由 ChaChing 于 2010-6-20 00:43 编辑 ]

sigma665 发表于 2007-11-19 20:15

强顶此贴,要是早点看到,节省了我不少时间啊

jevy151 发表于 2007-11-21 14:48

好贴,学习了!看到楼主的帖子,让我深受启发,把符号运算改成数值运算(积分),计算时间节省到以前的1/20!,希望楼主多多发贴啊

93758902 发表于 2007-11-21 23:28

顶,我觉得要是用inline可能会方便

abcdefg 发表于 2008-5-13 15:25

例子好精彩啊,能不能给个二重积分的例子啊
页: [1] 2 3 4 5
查看完整版本: [示例] 关于带参数的积分问题