请问一下,我用Grad和D对同一个矩阵函数求导,怎么结果不一样
mathematica吧
全部回复
仅看楼主
level 3
心之哀鸣 楼主
函数设计如下:
$Assumptions = A ∈ Matrices[{1, 2}, reals] && B ∈ Matrices[{1, 2}, reals]
x = {{x1}, {x2}};
MatrixForm[x]
f[x_] := A.(x x) - Log[B.x + C](*C为常数项*)
Grad[f[x], Transpose[x][[1]]]
结果输出是:
{A.{{{2 x1, 0}}, {{0, 2 x2}}} - B.{{{1, 0}}, {{0, 1}}}/(C + B.{{x1}, {x2}}),
A.{{{2 x1, 0}}, {{0, 2 x2}}} - B.{{{1, 0}}, {{0, 1}}}/(C + B.{{x1}, {x2}})}
这结果把我看呆了[呼~][呼~]。。。
之后我看了一下{{{2 x1, 0}}, {{0, 2 x2}}}的矩阵结构,如下:
MatrixForm[{{{2 x1, 0}}, {{0, 2 x2}}}]
之后,我设置:
A = {0.25, 1};
B = {-1, -0.2};
C为3,
x1 = 3;
x2 = 1;
结果是:
{{{-3.5, 1.}}, {{-3.5, 1.}}}
这结果也太邪门了吧?。。。[呼~]
之后,我用D来对x1做单独求导:
D[f[x], x1]
结果:
A.{{2 x1}, {0}} - B.{{1}, {0}}/(C + B.{{x1}, {x2}})
再把数值设为上面用的。
最后结果为:
{1.1875}
我感觉这个还算合理。。。
我很奇怪,梯度和偏导难道不该是相等的吗?但是在这里,两者的结果为何不同?
2020年09月27日 10点09分 1
吧务
level 15
……
1. Mathematica 目前对隐式矩阵的代数变换还比较弱,Stackexchange 上有一些程序包可用,当然功能还是有限,
不过你的问题和这点没有关系。
2. reals 应该是 Reals,具体请参看吧里精品《【征集】学习Mathematica时最常见的问题暨Mathematica吧“十戒”》及《有的字母蓝,有的字母黑,你知道为什么吗?你对语法着色有认识吗》,
不过这一点和你的问题依旧没有关系。
3. 如果你非要用行列概念来理解 Mathematica 的点乘运算,那么请注意,Mathematica 里的默认点乘规则是
行乘行。最好的做法是把行列的概念忘掉,因为这根本是做茧自缚。基于层次结构的理解要直接得多,且可以轻易推广到高维情形。
4. 看不懂第3条就把 Transpose[x][[1]] 拿出来单独执行下看输出了啥。
2020年10月03日 03点10分 2
好的,3Q!
2020年10月03日 05点10分
@心之哀鸣 啊,漏了一条:$Assumptions 只对具有 Assumptions 选项的函数起作用,所以你这里设了等于白设,不过这条依旧和你的问题没有直接关系。
2020年10月03日 05点10分
@心之哀鸣 再顺便,一维向量的 MatrixForm 是可以用 TableDirections -> Row 来改的。
2020年10月03日 12点10分
1