MATLAB中带有两个变量的函数的一阶和二阶偏导数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MATLAB中带有两个变量的函数的一阶和二阶偏导数相关的知识,希望对你有一定的参考价值。

我试图在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(不是混合)的二阶部分?

提前谢谢你的帮助!

答案

要回答你问过的问题,问题在于:(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作为2D矩阵,其中每个元素(a,b)是在velx=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));

以上是关于MATLAB中带有两个变量的函数的一阶和二阶偏导数的主要内容,如果未能解决你的问题,请参考以下文章

一元函数和多元函数的极值得判断有啥区别与联系?

什么是一阶导数和二阶导数?

xgboost为啥要用泰勒展开

Jacobian矩阵、Hessian矩阵和多元函数的二阶导数

Hessian矩阵

GBDT为什么不能并行,XGBoost却可以