找回密码
 注册
Simdroid-非首页
查看: 144|回复: 8

讨论一个函数句柄和quadgk的问题,似乎本版没见过

[复制链接]
发表于 2008-9-23 06:42:40 | 显示全部楼层 |阅读模式 来自 加拿大
quadgk(fun, a, b)对高频振荡函数的数值积分很有效,但前提是fun要是function handle.

举个例子:

我要积分 fun =  a1(i)*x+b1(j)*x^2+9
a1 and b1都是数组,怎样才能得到各个元素点的数值积分值呢?就是如何实现这个循环

我们要定义function,其只能有x一个未知量,i j怎么传递过去呢?如果定义成fun(x,i,j)似乎quadgk就不认了

function y=fun(x)
y=a1(i)*x+b1(j)*x^2+9;

还有一个很可恶的事情,如果用inline定义fun,则quadl可以求解,但quadgk就显示错误,要求fun必须是function handle,太可恶了。
这个还有解决办法吗?大家可以试试来想想办法,反正代码也很短。也帮小弟一个忙了
发表于 2008-9-23 09:49:53 | 显示全部楼层 来自 北京朝阳
Simdroid开发平台
事实上是,函数句柄要比inline有效率也方便的多。
fun = @(a1,b1) @(x)  a1*x+b1*x.^2+9

a1 = 1:10;
a2 = 1:10;
res = zeros(1,10);
a = 3;
b = 6;
for k=1:10
res(k) = quadgk(fun(a1(k),a2(k)), a, b)
end
手头没有MATLAB,自己试试吧。

[ 本帖最后由 rocwoods 于 2008-9-23 10:07 编辑 ]

评分

1

查看全部评分

回复 不支持

使用道具 举报

 楼主| 发表于 2008-9-23 10:33:49 | 显示全部楼层 来自 加拿大

回复 2# rocwoods 的帖子

怪不得rocwoods是版主,我是初级会员呢。多谢版主了。谢谢谢谢,我试试看
回复 不支持

使用道具 举报

发表于 2008-9-23 11:25:52 | 显示全部楼层 来自 北京

回复 2# rocwoods 的帖子

我们不谋而和啊
我刚这样试完,准备贴上,你已经重新编辑改过了
我的代码是
fun = @(a1,b1) @(x) a1.*x+b1.*x.^2+9;
a1 = 1:10;
b1 = 1:10;
a = 3;
b = 6;
for i=1:length(a1)
integ(i)=quad(fun(a1(i),b1(i)), a, b);
end

我没有找到quadgk这个函数

[ 本帖最后由 ljelly 于 2008-9-23 11:31 编辑 ]
回复 不支持

使用道具 举报

 楼主| 发表于 2008-9-24 03:15:30 | 显示全部楼层 来自 加拿大
都对,谢谢大家。不过我的实际问题复杂得多,还要请教一下
据个简单例子
fun1 = @(a1,b1) @(x) a1.*x+b1.*x.^2+9;
fun2 =  @(a2,b2) @(x) a2.*x+b2.*x.^4+9*x;

fun = (fun1+fun2)*(a1*x+b2*x^2);
应该如何定义复合函数fun呢?使得fun1 , fun2都能带进去,并且保证最后fun只是x的句柄函数,才可以quadgk积分
帮助上没找到定义多个变量组的句柄函数,只好来请教高人
回复 不支持

使用道具 举报

发表于 2008-9-24 14:25:49 | 显示全部楼层 来自 北京朝阳
对于给定的a1,a2,b1,b2

  1. fun = (fun1(a1,b1)+fun2(a2,b2)).*(a1*x+b2*x.^2);
复制代码
即可
回复 不支持

使用道具 举报

发表于 2009-4-22 08:45:39 | 显示全部楼层 来自 江苏南京
6# rocwoods
>> fun1 = @(a1,b1) @(x) a1.*x+b1.*x.^2+9;

>> fun2 =  @(a2,b2) @(x) a2.*x+b2.*x.^4+9*x;
>> a1=1;
>> a2=2;
>> b1=1;
>> b2=2;
>> fun = (fun1(a1,b1)+fun2(a2,b2)).*(a1*x+b2*x.^2);
??? Undefined function or method 'plus' for input arguments of type
'function_handle'.

不行啊
回复 不支持

使用道具 举报

发表于 2009-4-22 10:34:56 | 显示全部楼层 来自 北京朝阳
6# rocwoods
>> fun1 = @(a1,b1) @(x) a1.*x+b1.*x.^2+9;

>> fun2 =  @(a2,b2) @(x) a2.*x+b2.*x.^4+9*x;
>> a1=1;
>> a2=2;
>> b1=1;
>> b2=2;
>> fun = (fun1(a1,b1)+fun2(a2,b2)).*(a1*x+b2*x.^2);
?? ...
sigma665 发表于 2009-4-22 08:45

  1. fun11 = fun1(a1,b1);
  2. fun22 = fun2(a2,b2);
  3. fun = @(x) (fun11(x) + fun22(x)).*(a1*x+b2*x.^2);
复制代码

评分

1

查看全部评分

回复 不支持

使用道具 举报

发表于 2009-4-22 10:53:48 | 显示全部楼层 来自 江苏南京
8# rocwoods

谢谢
回复 不支持

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Simapps系列直播

Archiver|小黑屋|联系我们|仿真互动网 ( 京ICP备15048925号-7 )

GMT+8, 2024-10-7 09:25 , Processed in 0.039867 second(s), 14 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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