链接中的问题:
可以分析集成,答案是 4,但是我有兴趣使用 Matlab 对其进行数值集成,因为它在形式上类似于我无法分析集成的问题。数值积分的困难在于两个内积分中的函数是 的函数,x
并且y
不能因式分解。z
z
问问题
1315 次
2 回答
1
这绝不是优雅的。希望有人能比我更好地使用matlab函数。我已经尝试过蛮力的方式来练习数值积分。我试图通过利用它也乘以 z 的事实来避免 z=0 处的内部积分中的极点。我得到 3.9993。有人必须通过使用比梯形规则更好的东西来获得更好的解决方案
function []=sofn
clear all
global x y z xx yy zz dx dy
dx=0.05;
x=0:dx:1;
dy=0.002;
dz=0.002;
y=0:dy:1;
z=0:dz:2;
xx=length(x);
yy=length(y);
zz=length(z);
s1=0;
for i=1:zz-1
s1=s1+0.5*dz*(z(i+1)*exp(inte1(z(i+1)))+z(i)*exp(inte1(z(i))));
end
s1
end
function s2=inte1(localz)
global y yy dy
if localz==0
s2=0;
else
s2=0;
for j=1:yy-1
s2=s2+0.5*dy*(inte2(y(j),localz)+inte2(y(j+1),localz));
end
end
end
function s3=inte2(localy,localz)
global x xx dx
s3=0;
for k=1:xx-1
s3=s3+0.5*dx*(2/(localy+localz));
end
end
于 2013-10-31T06:56:27.580 回答
0
好吧,这很奇怪,因为在发布者之前的类似问题上,我声称这无法完成,现在在看了 Guddu 的答案后,我意识到它并没有那么复杂。我之前写的,数值积分产生一个数字而不是一个函数,这是正确的——但题外话:人们可以定义一个函数来评估每个给定参数的积分,这样实际上一个函数确实有一个函数作为数值积分的结果。
无论如何,这里是:
function q = outer
f = @(z) (z .* exp(inner(z)));
q = quad(f, eps, 2);
end
function qs = inner(zs)
% compute \int_0^1 1 / (y + z) dy for given z
qs = nan(size(zs));
for i = 1 : numel(zs)
z = zs(i);
f = @(y) (1 ./ (y + z));
qs(i) = quad(f, 0 , 1);
end
end
我在评论中应用了我自己建议的简化,消除了 x。该函数inner
计算 y 上的内积分值作为 z 的函数。然后函数 external 计算 z 上的外积分。我通过让积分从0 开始eps
而不是 0 来避免 z = 0 处的极点。结果是
4.00000013663955
inner
必须使用for
循环来实现,因为给定的函数quad
需要能够同时为多个参数值返回其值。
于 2013-10-31T19:46:20.770 回答