【问题标题】:Numerical Integration in MatLabMatLab 中的数值积分
【发布时间】:2013-05-14 04:35:00
【问题描述】:

我正在尝试使用 Matlab 的 dblquad 计算积分。为此,我首先编写了一个脚本函数。我的代码是

function z = IntRect(x, y)
%The variables
z0=20;
x0=15;
y0=20;
rl=sqrt(x.^2+y.^2+(z0/2)^2);
theta=acos(z0./(2*rl));
phi=atan(y./x);
%The function
z=(x0-z0*tan(theta).*cos(phi))*(y0-z0*tan(theta).*sin(phi))*(z0/2)^4;
z=z/rl.^3;

要计算我在命令窗口中输入的数值积分

z0=20;x0=15;y0=20;
Q = dblquad(@IntRect,0,x0/2,0,y0/2,1.e-6);

我收到一个错误提示

??? Error using ==> mtimes
Inner matrix dimensions must agree.

Error in ==> IntRect at 8
z=(x0-z0*tan(theta).*cos(phi))*(y0-z0*tan(theta).*sin(phi))*(z0/2)^4;

Error in ==> quad at 77
y = f(x, varargin{:});

Error in ==> dblquad>innerintegral at 84
    Q(i) = quadf(intfcn, xmin, xmax, tol, trace, y(i), varargin{:});

Error in ==> quad at 77
y = f(x, varargin{:});

Error in ==> dblquad at 60
Q = quadf(@innerintegral, ymin, ymax, tol, trace, intfcn, ...

我做错了什么?

编辑

替换

z=(x0-z0*tan(theta).*cos(phi))*(y0-z0*tan(theta).*sin(phi))*(z0/2)^4;

z=(x0-z0*tan(theta).*cos(phi)).*(y0-z0*tan(theta).*sin(phi))*(z0/2)^4;

我收到一个新错误

??? Index exceeds matrix dimensions.

Error in ==> quad at 85
if ~isfinite(y(7))

Error in ==> dblquad>innerintegral at 84
    Q(i) = quadf(intfcn, xmin, xmax, tol, trace, y(i), varargin{:});

Error in ==> quad at 77
y = f(x, varargin{:});

Error in ==> dblquad at 60
Q = quadf(@innerintegral, ymin, ymax, tol, trace, intfcn, ...

【问题讨论】:

  • 开始调试。第一个错误发生的第 8 行变量的维度是多少?
  • @Schorsch:非常感谢您的评论。那是我不确定的事情...我知道问题出在thetaphi 变量中,但我无法确定。我所知道的是,它们的尺寸完全相同。所以我在第 8 行使用了phi' 而不是phi,但我得到了完全相同的错误......

标签: matlab integration numeric numerical


【解决方案1】:

你需要一个元素操作符

z=(x0-z0*tan(theta).*cos(phi)).*(y0-z0*tan(theta).*sin(phi))*(z0/2)^4;
                              ^
                              | 

【讨论】:

  • 非常感谢您的回答!尺寸误差确实消失了,但我仍然无法计算积分。出现的错误说。请检查我更新的问题是否有错误。谢谢!
  • @Thanos - 请相应地更新问题,无法阅读评论。您可能想为新问题考虑一个新问题...
【解决方案2】:

正如dblquad 的帮助所说,输入x 是一个向量,y 是一个标量,而输出z 也是一个向量。因此,您的被积函数中的任何 x 函数都将是一个向量(例如,rl),您需要小心在适当的情况下使用逐元素运算符。你没有在最后一行这样做。

另外,考虑通过函数句柄传递初始值参数,而不是在被积函数中复制它们:

function dblquadtest
z0 = 20; x0 = 15; y0 = 20;
f = @(x,y)IntRect(x,y,x0,y0,z0);
Q = dblquad(f,0,x0/2,0,y0/2); % 1e-6 is the default tolerance

function z = IntRect(x, y, x0, y0, z0)
%The variables
rl=sqrt(x.^2+y.^2+(z0/2)^2);
theta=acos(z0./(2*rl));
phi=atan(y./x);
%The function
z=(x0-z0*tan(theta).*cos(phi)).*(y0-z0*tan(theta).*sin(phi))*(z0/2)^4;
z=z./rl.^3;

【讨论】:

  • 非常感谢您的回答!!!有用!正如您所指出的,这是最后一行,非常感谢!但是我不太了解通过句柄函数传递初始值的部分。你的意思是创建一个新函数dblquadtest并在命令提示符下运行这个函数?
  • 这正是我在上面的答案中对变量 f 所做的事情。具体来说,f 是一个anonymous function,其中xy 在运行时由dblquad 传入,其他的在f 创建时传入一次。可以在 M 文件或 Matlab 命令窗口中创建匿名函数。
猜你喜欢
  • 2023-03-08
  • 1970-01-01
  • 1970-01-01
  • 2021-07-20
  • 2014-06-12
  • 1970-01-01
  • 2019-07-19
  • 2013-05-11
  • 2016-05-12
相关资源
最近更新 更多