# How to make Jacobian automatically in Mathematica

If we have two vectors, a and b, how can I make Jacobian matrix automatically in Mathematica?

$$a=\left( \begin{array}{c} \text{x1}^3+2\text{x2}^2 \\ 3\text{x1}^4+7\text{x2} \end{array} \right);b=\left( \begin{array}{c} \text{x1} \\ \text{x2} \end{array} \right);J=\left( \begin{array}{cc} \frac{\partial \left(\text{x1}^3+2\text{x2}^2\right)}{\partial \text{x1}} & \frac{\partial \left(\text{x1}^3+2\text{x2}^2\right)}{\partial \text{x2}} \\ \frac{\partial \left(3\text{x1}^4+7\text{x2}\right)}{\partial \text{x1}} & \frac{\partial \left(3\text{x1}^4+7\text{x2}\right)}{\partial \text{x2}} \end{array} \right);$$

-

The easiest way to get the Jacobian is

D[a,{b}]


To get the format of a matrix, you would do MatrixForm[D[f, {x}], or D[f, {x}]//MatrixForm, as the comment by azdahak says.

There is no special matrix type in MMA - it's internally always stored as a list of lists.

Edit

Since this question is partly about the format of the matrix and its elements, I thought it's worth adding a definition that makes calculus output look prettier, and in the case of the Jacobian lets you write symbolic matrices like this:

$\left( \begin{array}{cc} \frac{\partial f_{\text{x}}}{\partial x} & \frac{\partial f_{\text{x}}}{\partial y} \\ \frac{\partial f_{\text{y}}}{\partial x} & \frac{\partial f_{\text{y}}}{\partial y} \\ \end{array} \right)$

The definition was initially posted as a comment on the Wolfram Blog:

Derivative /:
MakeBoxes[Derivative[α__][f1_][vars__Symbol],
Module[{bb, dd, sp},
MakeBoxes[dd, _] ^=
If[Length[{α}] == 1, "\[DifferentialD]", "\[PartialD]"];
MakeBoxes[sp, _] ^= "\[ThinSpace]";
bb /: MakeBoxes[bb[x__], _] := RowBox[Map[ToBoxes[#] &, {x}]];
FractionBox[ToBoxes[bb[dd^Plus[α], f1]],
ToBoxes[Apply[bb,
Riffle[Map[bb[dd, #] &,
Select[({vars}^{α}), (# =!= 1 &)]], sp]
]
]
]
]


With this, you can get the above matrix form with traditional partial derivatives like this:

First define the vector components with subscripts as is conventional. To avoid confusion between subscripts and variable names, use strings for the subscripts:

fVector = Array[Subscript[f, {"x", "y"}[[#]]][x, y] &, 2]


Then form the Jacobian and display it in TraditionalForm:

D[fVector, {{x, y}}] // MatrixForm // TraditionalForm


The result is as shown above.

-
but output is vector not Matrix? –  George Mills May 19 '12 at 14:34
How to print matrix J, to see output from Jarga? –  George Mills May 19 '12 at 14:35
Like this: D[{x^3+2y^2,3x^4+7y},{{x,y}}]//MatrixForm –  azdahak May 19 '12 at 14:40
Elegant solution. –  Jagra May 19 '12 at 15:29
this makes me so. happy. +1 –  Ghersic Jun 8 at 6:02

See: Jacobian matrix

The Jacobian matrix and determinant can be computed using the Mathematica commands:

JacobianMatrix[f_List?VectorQ, x_List] :=
Outer[D, f, x] /; Equal@@(Dimensions/@{f,x})

JacobianDeterminant[f_List?VectorQ, x_List] :=
Det[JacobianMatrix[f, x]] /;
Equal @@ (Dimensions /@ {f, x})


a = {x1^3 + 2 x2^2, 3 x1^4 + 7 x2}
b = {x1, x2}
JacobianMatrix[a, b] // MatrixForm


Or maybe what you want looks like this:

 JacobianMatrix[b, a] // MatrixForm


-
it is not working as JacobianMatrix[a_List?VectorQ, b_List] := Outer[D, a, b] /; Equal @@ (Dimensions /@ {a, b}) –  George Mills May 19 '12 at 14:29
How to print matrix J, to see output? –  George Mills May 19 '12 at 14:31
it is not working as Needs["VectorAnalysis`"] a = ( { {x1^3 + 2 x2^2}, {3 x1^4 + 7 x2} } ); b = ( { {x1}, {x2} } ); JacobianMatrix[a, b] // MatrixForm –  George Mills May 19 '12 at 14:56
Your comment code, a = ( { {x1^3 + 2 x2^2}, {3 x1^4 + 7 x2} } ); b = ( { {x1}, {x2} } ); defines 2 matrixes. Placing the terms in vectors they should look like this: a ={x1^3 + 2 x2^2,3 x1^4 + 7 x2}; b = {x1, x2}; –  Jagra May 19 '12 at 15:03