- 积分
- 15
- 注册时间
- 2013-8-29
- 仿真币
-
- 最后登录
- 1970-1-1
|
发表于 2014-6-1 17:54:08
|
显示全部楼层
来自 加拿大
你应该仔细看看 quad2d 的帮助文档,你便不难发现你的被积函数 z(x,y) 定义有问题
q = quad2d(fun,a,b,c,d) approximates the integral of fun(x,y)
All input functions must be vectorized. The function Z=fun(X,Y) must accept 2-D matrices X and Y of the same size and return a matrix Z of corresponding values.
可见 quad2d 要求 Z=fun(X,Y) 中 X、Y、Z 是同尺寸的矩阵,而按照你目前的定义,你是将X、Y看作了向量,并且,你的输出 Z 的尺寸和X、Y不同,这是造成错误的根本原因。按照这个要求,你的代码可以修改为:
f=quad2d(@(x,y)z(x,y),-10,10,-10,10)
function result=z(x,y)
result=zeros(size(x));
for k=1:size(x,1)
for l=1:size(x,2)
if x(k,l)>=0 && x(k,l)<=1 && y(k,l)>=0 && y(k,l)<=1
result(k,l)=1;
else
result(k,l)=0;
end
end
end
end
或者用线性索引,修改为:
f=quad2d(@(x,y)z(x,y),-10,10,-10,10)
function result=z(x,y)
result=zeros(size(x));
for k=1:numel(x)
if x(k)>=0 && x(k)<=1 && y(k)>=0 && y(k)<=1
result(k)=1;
else
result(k)=0;
end
end
end
最后,我想说的是,你一开始说 “而我的问题无法用匿名函数表达,只能用嵌套函数这类的”,这显然是不成立的。如果可以用嵌套函数表达的话,一般也是可以用匿名函数表达,至少,你这里的被积函数可以轻松用匿名函数实现,而且你的函数定义没有必要用循环实现,应该充分利用向量化计算的优点:
f = @(x,y) (0<=x & x<=1 & 0<=y & y<=1)*1;
quad2d(f,-10,10,-10,10)
|
评分
-
2
查看全部评分
-
|