声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 33136|回复: 63

[编程技巧] [示例] 关于带参数的积分问题

  [复制链接]
发表于 2007-5-9 17:41 | 显示全部楼层 |阅读模式

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

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

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

点评

赞成: 5.0
赞成: 5
  发表于 2014-3-27 18:45

评分

1

查看全部评分

回复
分享到:

使用道具 举报

发表于 2007-5-9 19:22 | 显示全部楼层

  1. clear all
  2. k=linspace(1,5);
  3. for i=1:length(k)
  4.     kk=k(i);
  5.     fun=['sin(',num2str(kk),'*x).*x.^2'];
  6.     y(i)=quadl(inline(fun),1,5);
  7. end
  8. plot(k,y)
复制代码

  1. clear all
  2. k=linspace(1,5);
  3. for i=1:length(k)
  4.     kk=k(i);
  5.     fun=inline(subs('sin(k*x)*x^2','k',kk));
  6.     y(i)=quadl(fun,1,5);
  7. end
  8. hold on;
  9. plot(k,y,'r')
复制代码

评分

1

查看全部评分

发表于 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)

评分

1

查看全部评分

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

[ 本帖最后由 ChaChing 于 2010-6-20 00:38 编辑 ]
 楼主| 发表于 2007-5-10 15:44 | 显示全部楼层
希望qhdhfcy 能了解我写这个示例程序的本意所在.
该程序的威力不在于本例,而在于求解那些无显式积分的问题.

另:你说的"y=sin(k.*x).*x.^2,对x积分,然后在积分区域【1,5】上画x 和 y 的图形"似乎有问题,既然已经对x积分,你还能画出x 和 y 的图形?
发表于 2007-5-10 16:49 | 显示全部楼层
原帖由 qhdhfcy 于 2007-5-10 15:04 发表
这个问题挑战性太小,可以先求出积分,再画曲线
如果把问题改成这样呢:
y=sin(k.*x).*x.^2,对x积分,然后在积分区域【1,5】上画x 和 y 的图形?

xjzuo版主发这个帖的目的是希望大家一起完善下“带参数的积分问题”的求解方法,为了描述问题方便只是简单举了这个函数作为例子。
发表于 2007-5-10 16:49 | 显示全部楼层
明白了,原来误解大家的意思了,请多见谅啊
发表于 2007-6-8 23:04 | 显示全部楼层
好,不错 。
谢谢,支持一下。:lol
发表于 2007-8-30 14:04 | 显示全部楼层
再补充两个方法,形式更加简单了。
方法一(用循环):
  1. f=@(k) quad(@(x)  sin(k.*x).*x.^2,0,5)
  2. kk=linspace(0,5);
  3. y=zeros(size(kk));
  4. for ii=1:length(kk)
  5. y(ii)=f(kk(ii));
  6. end
  7. plot(kk,y)
复制代码

方法二(不用循环):
  1. 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 编辑 ]

评分

1

查看全部评分

发表于 2007-9-2 20:41 | 显示全部楼层
@什么意思?问楼上!!!
了解到了:表示 f是一个函数,返回值是函数的句柄!但是想知道函数的句柄是什么概念?

[ 本帖最后由 ChaChing 于 2010-6-20 00:40 编辑 ]
发表于 2007-9-2 21:17 | 显示全部楼层
原帖由 caichengtao 于 2007-9-2 20:32 发表
@什么意思?问楼上!!!

匿名函数 或者 函数的句柄
相当于其他语言的“指针”

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

评分

1

查看全部评分

发表于 2007-11-19 20:15 | 显示全部楼层
强顶此贴,要是早点看到,节省了我不少时间啊
发表于 2007-11-21 14:48 | 显示全部楼层
好贴,学习了!看到楼主的帖子,让我深受启发,把符号运算改成数值运算(积分),计算时间节省到以前的1/20!,希望楼主多多发贴啊
发表于 2007-11-21 23:28 | 显示全部楼层
顶,我觉得要是用inline可能会方便
发表于 2008-5-13 15:25 | 显示全部楼层
例子好精彩啊,能不能给个二重积分的例子啊
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

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

GMT+8, 2024-12-26 09:26 , Processed in 0.070406 second(s), 21 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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