【问题标题】:First and second order partial derivatives of function with two variables in MATLABMATLAB中具有两个变量的函数的一阶和二阶偏导数
【发布时间】:2019-02-17 14:59:52
【问题描述】:

我正在尝试在 MATLAB 中实现不同的数值方法,而不使用内置函数,例如梯度或 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(不是混合)重复的二阶部分?

提前感谢您的帮助!

【问题讨论】:

  • vel 的定义中,您可能混淆了向量x 和局部变量x。尝试更改局部变量的名称,例如@(x1,y1)...

标签: matlab numerical-methods differentiation


【解决方案1】:

要回答您提出的问题,问题在于:(x(jj+1,ii)-x(jj,ii)x 是一个向量,但您将其视为矩阵。但是,我认为您的代码中存在更深层次的问题。一方面,你对待vel 的方式很不寻常。您已经编写为xy 的函数,其中xy 可能是向量(或矩阵),但您只能用标量调用它。如果我不得不猜测,我会假设你想写 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 构造为一个二维矩阵,其中每个元素(a,b) 是velx=ay=b 处评估的值。完成此操作后,您实际上可以取消双重嵌套的 for 循环(这在 MATLAB 中几乎从来没有一个好主意):

derivx = (vel(2:end,1:end-1) - vel(1:end-1,1:end-1)./(x(2:end)-x(1:end-1));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-25
    相关资源
    最近更新 更多