我正在尝试在MATLAB中实现不同的数值方法,而不使用内置函数(例如,gradient或del2)。到目前为止,这是我的代码:
clear all
close all
x = [-1:0.1:1];
y = [-2:0.1:2];
vel = @(x,y) x+exp(-((x-x(1)).^2+(y-y(1)).^2));
nx = length(x);
ny = length(y);
derivx = zeros(nx-1,ny-1)
% The partial derivative with respect to x
for ii = 1:nx-1
for jj = 1:ny-1
derivx(ii,jj) = (vel(ii+1,jj) - vel(ii,jj))./(x(jj+1,ii)-x(jj,ii));
end
end
% The partial with respect to y
derivy = zeros(ny-1,nx-1)
for ii = 1:ny-1
for jj = 1:nx-1
derivy(ii,jj) = (vel(ii+1,jj) - vel(ii,jj))./(y(jj+1,ii)-y(jj,ii));
end
end
此代码不适用于错误消息,指出矩阵索引已超出。
Index in position 1 exceeds array bounds (must not exceed 1).
Error in untitled6 (line 13)
derivx(ii,jj) = (vel(ii+1,jj) - vel(ii,jj))./(x(jj+1,ii)-x(jj,ii));
然后我将如何继续计算重复x和y(而不是混合的)的二阶偏函数?
谢谢您的帮助!
答案 0 :(得分:0)
要回答您提出的问题,问题在于此:(x(jj+1,ii)-x(jj,ii)
。 x
是向量,但您将其视为矩阵。但是,我认为您的代码中存在更深层次的问题。一方面,您对待vel
的方式很不寻常。您已经写成x
和y
的函数,其中x
和y
大概是向量(或矩阵),但是您只能用标量来称呼它。如果我不得不猜测,我假设您想将vel
编写为:
x = [-1:0.1:1];
y = [-2:0.1:2]'; % Note the transpose here
vel = x+exp(-((x-x(1)).^2+(y-y(1)).^2));
这会将vel
构造为2D矩阵,其中每个元素(a,b)都是在vel
和x=a
处评估的y=b
的值。完成此操作后,实际上就可以消除双嵌套的for循环了(在MATLAB中,从来没有这几乎是个好主意):
derivx = (vel(2:end,1:end-1) - vel(1:end-1,1:end-1)./(x(2:end)-x(1:end-1));