Difference between revisions of "DPL94 derivatives"

From relax wiki
Jump to navigation Jump to search
(Created page with "== Jacobian == <source lang="python"> from sympy import * # In contrast to other Computer Algebra Systems, in SymPy you have to declare symbolic variables explicitly: R1 = S...")
 
(Added an introductory sentence and see also section. This is to move this page out of the dead-end page list (http://wiki.nmr-relax.com/Special:DeadendPages).)
 
(9 intermediate revisions by one other user not shown)
Line 1: Line 1:
 +
These are the first and second partial derivatives of the equations of the [[DPL94]] [[:Category:Relaxation dispersion analysis|relaxation dispersion]] model.
 +
 +
== Equation ==
 +
<math>
 +
\mathrm{R}_{1\rho}= \mathrm{R}_1\cos^2\theta + \left( \mathrm{R}_{1\rho}{´} + \frac{\Phi_\textrm{ex} \textrm{k}_\textrm{ex}}{\textrm{k}_\textrm{ex}^2 + \omega_\textrm{e}^2} \right) \sin^2\theta
 +
</math>
 +
 
== Jacobian ==
 
== Jacobian ==
 +
=== sympy ===
 
<source lang="python">
 
<source lang="python">
 
from sympy import *
 
from sympy import *
Line 26: Line 34:
 
print("""Form the Jacobian matrix by:
 
print("""Form the Jacobian matrix by:
 
------------------------------------------------------------------------------
 
------------------------------------------------------------------------------
from numpy import array, transpose
+
from numpy import array, cos, sin, pi, transpose
+
 
 +
R1 = 1.1
 +
theta = pi / 4
 +
R1rho_p = 10.
 +
phi_ex = 1100.
 +
kex = 2200.
 +
we = 3300.
 +
 
 
d_f_d_R1 = %s
 
d_f_d_R1 = %s
 
d_f_d_theta = %s
 
d_f_d_theta = %s
Line 35: Line 50:
 
d_f_d_we = %s
 
d_f_d_we = %s
 
jacobian_matrix = transpose(array( [d_f_d_R1 , d_f_d_theta, d_f_d_R1rho_p, d_f_d_phi_ex, d_f_d_kex, d_f_d_we] ) )
 
jacobian_matrix = transpose(array( [d_f_d_R1 , d_f_d_theta, d_f_d_R1rho_p, d_f_d_phi_ex, d_f_d_kex, d_f_d_we] ) )
 +
 +
print jacobian_matrix
 
------------------------------------------------------------------------------
 
------------------------------------------------------------------------------
 
""" % (d_f_d_R1, d_f_d_theta, d_f_d_R1rho_p, d_f_d_phi_ex, d_f_d_kex, d_f_d_we) )
 
""" % (d_f_d_R1, d_f_d_theta, d_f_d_R1rho_p, d_f_d_phi_ex, d_f_d_kex, d_f_d_we) )
 +
 +
#### Method 2
 +
# http://docs.sympy.org/0.7.2/modules/matrices/matrices.html
 +
 +
# The vectorial function.
 +
X = Matrix([R1 * cos(theta)**2 + (R1rho_p + ( (phi_ex * kex) / (kex**2 + we**2) ) ) * sin(theta)**2])
 +
# What to derive for.
 +
Y = Matrix([R1, theta, R1rho_p, phi_ex, kex, we])
 +
 +
# Make the Jacobian
 +
Jacobian = X.jacobian(Y)
 +
 +
jac_string = str(Jacobian)
 +
jac_string_arr = jac_string.replace("Matrix", "array")
 +
 +
print("""Form the Jacobian matrix by:
 +
------------------------------------------------------------------------------
 +
from numpy import array, cos, sin, pi, transpose
 +
 +
R1 = 1.1
 +
theta = pi / 4
 +
R1rho_p = 10.
 +
phi_ex = 1100.
 +
kex = 2200.
 +
we = 3300.
 +
 +
jacobian_matrix_2 = %s
 +
 +
print jacobian_matrix_2
 +
------------------------------------------------------------------------------
 +
""" % (jac_string_arr) )
 
</source>
 
</source>
  
output
+
=== output ===
 +
output is
 
<source lang="python">
 
<source lang="python">
from numpy import array, transpose
+
from numpy import array, cos, sin, pi, transpose
+
 
 +
R1 = 1.1
 +
theta = pi / 4
 +
R1rho_p = 10.
 +
phi_ex = 1100.
 +
kex = 2200.
 +
we = 3300.
 +
 
 
d_f_d_R1 = cos(theta)**2
 
d_f_d_R1 = cos(theta)**2
 
d_f_d_theta = -2*R1*sin(theta)*cos(theta) + 2*(R1rho_p + kex*phi_ex/(kex**2 + we**2))*sin(theta)*cos(theta)
 
d_f_d_theta = -2*R1*sin(theta)*cos(theta) + 2*(R1rho_p + kex*phi_ex/(kex**2 + we**2))*sin(theta)*cos(theta)
Line 50: Line 106:
 
d_f_d_we = -2*kex*phi_ex*we*sin(theta)**2/(kex**2 + we**2)**2
 
d_f_d_we = -2*kex*phi_ex*we*sin(theta)**2/(kex**2 + we**2)**2
 
jacobian_matrix = transpose(array( [d_f_d_R1 , d_f_d_theta, d_f_d_R1rho_p, d_f_d_phi_ex, d_f_d_kex, d_f_d_we] ) )
 
jacobian_matrix = transpose(array( [d_f_d_R1 , d_f_d_theta, d_f_d_R1rho_p, d_f_d_phi_ex, d_f_d_kex, d_f_d_we] ) )
 +
 +
print jacobian_matrix
 +
 +
R1 = 1.1
 +
theta = pi / 4
 +
R1rho_p = 10.
 +
phi_ex = 1100.
 +
kex = 2200.
 +
we = 3300.
 +
 +
jacobian_matrix_2 = array([[cos(theta)**2, -2*R1*sin(theta)*cos(theta) + 2*(R1rho_p + kex*phi_ex/(kex**2 + we**2))*sin(theta)*cos(theta),
 +
sin(theta)**2, kex*sin(theta)**2/(kex**2 + we**2), (-2*kex**2*phi_ex/(kex**2 + we**2)**2 + phi_ex/(kex**2 + we**2))*sin(theta)**2, -2*kex*phi_ex*we*sin(theta)**2/(kex**2 + we**2)**2]])
 +
 +
print jacobian_matrix_2
 
</source>
 
</source>
 +
 +
== Hessian ==
 +
=== sympy ===
 +
<source lang="python">
 +
from sympy import *
 +
 +
# In contrast to other Computer Algebra Systems, in SymPy you have to declare symbolic variables explicitly:
 +
R1 = Symbol('R1')
 +
theta = Symbol('theta')
 +
R1rho_p = Symbol('R1rho_p')
 +
phi_ex = Symbol('phi_ex')
 +
kex = Symbol('kex')
 +
we = Symbol('we')
 +
 +
# Define function
 +
f = R1 * cos(theta)**2 + (R1rho_p + ( (phi_ex * kex) / (kex**2 + we**2) ) ) * sin(theta)**2
 +
 +
print("Now calculate the Hessian.\n")
 +
 +
# Define symbols to derive for.
 +
syms = [R1, theta, R1rho_p, phi_ex, kex, we]
 +
 +
# Do the hessian.
 +
hess = hessian(f, syms)
 +
 +
hess_string = str(hess)
 +
hess_string_arr = hess_string.replace("Matrix", "array")
 +
 +
print("""Form the Hessian matrix by:
 +
------------------------------------------------------------------------------
 +
from numpy import array, cos, sin, pi
 +
 +
R1 = 1.1
 +
theta = pi / 4
 +
R1rho_p = 10.
 +
phi_ex = 1100.
 +
kex = 2200.
 +
we = 3300.
 +
 +
hessian_matrix = %s
 +
 +
print hessian_matrix
 +
------------------------------------------------------------------------------
 +
""" % (hess_string_arr) )
 +
</source>
 +
 +
=== output ===
 +
output is
 +
<source lang="python">
 +
from numpy import array, cos, sin, pi
 +
 +
R1 = 1.1
 +
theta = pi / 4
 +
R1rho_p = 10.
 +
phi_ex = 1100.
 +
kex = 2200.
 +
we = 3300.
 +
 +
hessian_matrix = array([[0, -2*sin(theta)*cos(theta), 0, 0, 0, 0],
 +
[-2*sin(theta)*cos(theta), 2*R1*sin(theta)**2 - 2*R1*cos(theta)**2 - 2*(R1rho_p + kex*phi_ex/(kex**2 + we**2))*sin(theta)**2 + 2*(R1rho_p + kex*phi_ex/(kex**2 + we**2))*cos(theta)**2, 2*sin(theta)*cos(theta),
 +
2*kex*sin(theta)*cos(theta)/(kex**2 + we**2), 2*(-2*kex**2*phi_ex/(kex**2 + we**2)**2 + phi_ex/(kex**2 + we**2))*sin(theta)*cos(theta), -4*kex*phi_ex*we*sin(theta)*cos(theta)/(kex**2 + we**2)**2],
 +
[0, 2*sin(theta)*cos(theta), 0, 0, 0, 0], [0, 2*kex*sin(theta)*cos(theta)/(kex**2 + we**2), 0, 0, -2*kex**2*sin(theta)**2/(kex**2 + we**2)**2 + sin(theta)**2/(kex**2 + we**2), -2*kex*we*sin(theta)**2/(kex**2 + we**2)**2],
 +
[0, 2*(-2*kex**2*phi_ex/(kex**2 + we**2)**2 + phi_ex/(kex**2 + we**2))*sin(theta)*cos(theta), 0, -2*kex**2*sin(theta)**2/(kex**2 + we**2)**2 + sin(theta)**2/(kex**2 + we**2),
 +
(8*kex**3*phi_ex/(kex**2 + we**2)**3 - 6*kex*phi_ex/(kex**2 + we**2)**2)*sin(theta)**2, (8*kex**2*phi_ex*we/(kex**2 + we**2)**3 - 2*phi_ex*we/(kex**2 + we**2)**2)*sin(theta)**2],
 +
[0, -4*kex*phi_ex*we*sin(theta)*cos(theta)/(kex**2 + we**2)**2, 0, -2*kex*we*sin(theta)**2/(kex**2 + we**2)**2,
 +
(8*kex**2*phi_ex*we/(kex**2 + we**2)**3 - 2*phi_ex*we/(kex**2 + we**2)**2)*sin(theta)**2, 8*kex*phi_ex*we**2*sin(theta)**2/(kex**2 + we**2)**3 - 2*kex*phi_ex*sin(theta)**2/(kex**2 + we**2)**2]])
 +
 +
print hessian_matrix
 +
 +
</source>
 +
 +
== See also ==
 +
[[Category:Relaxation_dispersion analysis]]

Latest revision as of 08:16, 13 September 2014

These are the first and second partial derivatives of the equations of the DPL94 relaxation dispersion model.

Equation

[math] \mathrm{R}_{1\rho}= \mathrm{R}_1\cos^2\theta + \left( \mathrm{R}_{1\rho}{´} + \frac{\Phi_\textrm{ex} \textrm{k}_\textrm{ex}}{\textrm{k}_\textrm{ex}^2 + \omega_\textrm{e}^2} \right) \sin^2\theta [/math]

Jacobian

sympy

from sympy import *
 
# In contrast to other Computer Algebra Systems, in SymPy you have to declare symbolic variables explicitly:
R1 = Symbol('R1')
theta = Symbol('theta')
R1rho_p = Symbol('R1rho_p')
phi_ex = Symbol('phi_ex')
kex = Symbol('kex')
we = Symbol('we')

# Define function
f = R1 * cos(theta)**2 + (R1rho_p + ( (phi_ex * kex) / (kex**2 + we**2) ) ) * sin(theta)**2

print("Now calculate the Jacobian. The partial derivative matrix.\n")
print("Jacobian is m rows with function derivatives and n columns of parameters.")

d_f_d_R1 = diff(f, R1)
d_f_d_theta = diff(f, theta)
d_f_d_R1rho_p = diff(f, R1rho_p)
d_f_d_phi_ex = diff(f, phi_ex)
d_f_d_kex = diff(f, kex)
d_f_d_we = diff(f, we)

print("""Form the Jacobian matrix by:
------------------------------------------------------------------------------
from numpy import array, cos, sin, pi, transpose

R1 = 1.1
theta = pi / 4
R1rho_p = 10.
phi_ex = 1100.
kex = 2200.
we = 3300.

d_f_d_R1 = %s
d_f_d_theta = %s
d_f_d_R1rho_p = %s
d_f_d_phi_ex = %s
d_f_d_kex = %s
d_f_d_we = %s
jacobian_matrix = transpose(array( [d_f_d_R1 , d_f_d_theta, d_f_d_R1rho_p, d_f_d_phi_ex, d_f_d_kex, d_f_d_we] ) )

print jacobian_matrix
------------------------------------------------------------------------------
""" % (d_f_d_R1, d_f_d_theta, d_f_d_R1rho_p, d_f_d_phi_ex, d_f_d_kex, d_f_d_we) )

#### Method 2
# http://docs.sympy.org/0.7.2/modules/matrices/matrices.html

# The vectorial function.
X = Matrix([R1 * cos(theta)**2 + (R1rho_p + ( (phi_ex * kex) / (kex**2 + we**2) ) ) * sin(theta)**2])
# What to derive for.
Y = Matrix([R1, theta, R1rho_p, phi_ex, kex, we])

# Make the Jacobian
Jacobian = X.jacobian(Y)

jac_string = str(Jacobian)
jac_string_arr = jac_string.replace("Matrix", "array")

print("""Form the Jacobian matrix by:
------------------------------------------------------------------------------
from numpy import array, cos, sin, pi, transpose

R1 = 1.1
theta = pi / 4
R1rho_p = 10.
phi_ex = 1100.
kex = 2200.
we = 3300.

jacobian_matrix_2 = %s

print jacobian_matrix_2
------------------------------------------------------------------------------
""" % (jac_string_arr) )

output

output is

from numpy import array, cos, sin, pi, transpose

R1 = 1.1
theta = pi / 4
R1rho_p = 10.
phi_ex = 1100.
kex = 2200.
we = 3300.

d_f_d_R1 = cos(theta)**2
d_f_d_theta = -2*R1*sin(theta)*cos(theta) + 2*(R1rho_p + kex*phi_ex/(kex**2 + we**2))*sin(theta)*cos(theta)
d_f_d_R1rho_p = sin(theta)**2
d_f_d_phi_ex = kex*sin(theta)**2/(kex**2 + we**2)
d_f_d_kex = (-2*kex**2*phi_ex/(kex**2 + we**2)**2 + phi_ex/(kex**2 + we**2))*sin(theta)**2
d_f_d_we = -2*kex*phi_ex*we*sin(theta)**2/(kex**2 + we**2)**2
jacobian_matrix = transpose(array( [d_f_d_R1 , d_f_d_theta, d_f_d_R1rho_p, d_f_d_phi_ex, d_f_d_kex, d_f_d_we] ) )

print jacobian_matrix

R1 = 1.1
theta = pi / 4
R1rho_p = 10.
phi_ex = 1100.
kex = 2200.
we = 3300.

jacobian_matrix_2 = array([[cos(theta)**2, -2*R1*sin(theta)*cos(theta) + 2*(R1rho_p + kex*phi_ex/(kex**2 + we**2))*sin(theta)*cos(theta), 
sin(theta)**2, kex*sin(theta)**2/(kex**2 + we**2), (-2*kex**2*phi_ex/(kex**2 + we**2)**2 + phi_ex/(kex**2 + we**2))*sin(theta)**2, -2*kex*phi_ex*we*sin(theta)**2/(kex**2 + we**2)**2]])

print jacobian_matrix_2

Hessian

sympy

from sympy import *
 
# In contrast to other Computer Algebra Systems, in SymPy you have to declare symbolic variables explicitly:
R1 = Symbol('R1')
theta = Symbol('theta')
R1rho_p = Symbol('R1rho_p')
phi_ex = Symbol('phi_ex')
kex = Symbol('kex')
we = Symbol('we')

# Define function
f = R1 * cos(theta)**2 + (R1rho_p + ( (phi_ex * kex) / (kex**2 + we**2) ) ) * sin(theta)**2

print("Now calculate the Hessian.\n")

# Define symbols to derive for.
syms = [R1, theta, R1rho_p, phi_ex, kex, we]

# Do the hessian.
hess = hessian(f, syms)

hess_string = str(hess)
hess_string_arr = hess_string.replace("Matrix", "array")

print("""Form the Hessian matrix by:
------------------------------------------------------------------------------
from numpy import array, cos, sin, pi

R1 = 1.1
theta = pi / 4
R1rho_p = 10.
phi_ex = 1100.
kex = 2200.
we = 3300.

hessian_matrix = %s

print hessian_matrix
------------------------------------------------------------------------------
""" % (hess_string_arr) )

output

output is

from numpy import array, cos, sin, pi

R1 = 1.1
theta = pi / 4
R1rho_p = 10.
phi_ex = 1100.
kex = 2200.
we = 3300.

hessian_matrix = array([[0, -2*sin(theta)*cos(theta), 0, 0, 0, 0], 
[-2*sin(theta)*cos(theta), 2*R1*sin(theta)**2 - 2*R1*cos(theta)**2 - 2*(R1rho_p + kex*phi_ex/(kex**2 + we**2))*sin(theta)**2 + 2*(R1rho_p + kex*phi_ex/(kex**2 + we**2))*cos(theta)**2, 2*sin(theta)*cos(theta), 
2*kex*sin(theta)*cos(theta)/(kex**2 + we**2), 2*(-2*kex**2*phi_ex/(kex**2 + we**2)**2 + phi_ex/(kex**2 + we**2))*sin(theta)*cos(theta), -4*kex*phi_ex*we*sin(theta)*cos(theta)/(kex**2 + we**2)**2], 
[0, 2*sin(theta)*cos(theta), 0, 0, 0, 0], [0, 2*kex*sin(theta)*cos(theta)/(kex**2 + we**2), 0, 0, -2*kex**2*sin(theta)**2/(kex**2 + we**2)**2 + sin(theta)**2/(kex**2 + we**2), -2*kex*we*sin(theta)**2/(kex**2 + we**2)**2], 
[0, 2*(-2*kex**2*phi_ex/(kex**2 + we**2)**2 + phi_ex/(kex**2 + we**2))*sin(theta)*cos(theta), 0, -2*kex**2*sin(theta)**2/(kex**2 + we**2)**2 + sin(theta)**2/(kex**2 + we**2), 
(8*kex**3*phi_ex/(kex**2 + we**2)**3 - 6*kex*phi_ex/(kex**2 + we**2)**2)*sin(theta)**2, (8*kex**2*phi_ex*we/(kex**2 + we**2)**3 - 2*phi_ex*we/(kex**2 + we**2)**2)*sin(theta)**2], 
[0, -4*kex*phi_ex*we*sin(theta)*cos(theta)/(kex**2 + we**2)**2, 0, -2*kex*we*sin(theta)**2/(kex**2 + we**2)**2, 
(8*kex**2*phi_ex*we/(kex**2 + we**2)**3 - 2*phi_ex*we/(kex**2 + we**2)**2)*sin(theta)**2, 8*kex*phi_ex*we**2*sin(theta)**2/(kex**2 + we**2)**3 - 2*kex*phi_ex*sin(theta)**2/(kex**2 + we**2)**2]])

print hessian_matrix

See also