使用链式规则导数在MATLAB中不起作用

问题描述

我正在尝试为给定函数导出梯度和粗麻布。当我直接进行渐变时,效果很好,但是当我应用链式规则时,效果不佳,并抛出如下错误

Error using sym/diff (line 70)
Second argument must be a variable or a nonnegative integer specifying the number of differentiations.

Error in EO_a1 (line 12)
dfr = diff(f(x),r(x));

我的MATLAB代码

syms x a b const r(x)

const = (a*x);
r(x) = (const - b);
f(x) = (1/2)*(r(x)^2);

gradient = diff(f(x));
gradient;
hessian = diff(gradient);
hessian;

%gradient applying the chain rule
dfr = diff(f(x),r(x));
dfr;
drx = diff(dfr,x);
drx;

解决方法

可能不是理想的选择,但是您可以通过使用函数r(x)对函数functionalDerivative()进行派生。请注意,r(x)必须在评估链式规则的第一部分后声明。之后,可以在使用r'(x)替换符号r(x)的符号表示形式/等式之后,才能评估链式规则subs()的第二部分。之后,可以将链规则的两个部分相乘。完成此过程后,结果将与diff(f(x))相区别,而结果与您的第一个解决方案中的步骤解决方案相匹配,而x也可以由diff(f(x),x)进行简化。

%METHOD 2: CHAIN RULE%
clear;
syms x a b const r(x)
const = (a*x);

f(x) = (1/2)*(r(x)^2);

%First part of chain rule%
dfr = functionalDerivative(f,r(x));
dfr = subs(dfr,r(x),(const - b));

%Second part of chain rule%
drx = diff(dfr,x);

%Product of parts of the chain rule%
Chain_Rule_Result = dfr*drx;
Chain_Rule_Result

使用MATLAB R2019b运行