wlldhyz 发表于 2008-9-23 06:42:40

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

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,太可恶了。
这个还有解决办法吗?大家可以试试来想想办法,反正代码也很短。也帮小弟一个忙了

rocwoods 发表于 2008-9-23 09:49:53

事实上是,函数句柄要比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 编辑 ]

wlldhyz 发表于 2008-9-23 10:33:49

回复 2# rocwoods 的帖子

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

ljelly 发表于 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 编辑 ]

wlldhyz 发表于 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积分
帮助上没找到定义多个变量组的句柄函数,只好来请教高人

rocwoods 发表于 2008-9-24 14:25:49

对于给定的a1,a2,b1,b2
fun = (fun1(a1,b1)+fun2(a2,b2)).*(a1*x+b2*x.^2);
即可

sigma665 发表于 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'.

不行啊

rocwoods 发表于 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 http://forum.simwe.com/images/common/back.gif

fun11 = fun1(a1,b1);
fun22 = fun2(a2,b2);
fun = @(x) (fun11(x) + fun22(x)).*(a1*x+b2*x.^2);

sigma665 发表于 2009-4-22 10:53:48

8# rocwoods

谢谢
页: [1]
查看完整版本: 讨论一个函数句柄和quadgk的问题,似乎本版没见过