Example 1 (Magnetism data)
We apply the holonomic gradient descent method to the problem
minimize f(x,y,r=1) * exp( - S11*x11 - S12*x12 - S13*x13 - S22*x22 -
S23*x23 - S33*x33 - S1*y1 - S2*y2 - S3*y3 )
subject to (x11,x12,x13,x22,x23,x33,y1,y2,y3) in A (in R^9)
where
S11 = 0.045,
S12 = -0.075,
S13 = 0.014,
S22 = 0.921,
S23 = -0.122,
S33 = 0.034,
S1 = 0.083,
S2 = -0.959,
S3 = -0.131,
and
A=domain([-30,-30,-30,-30, -30, -1.0, -0.1, -30, -30],
[ 10, 10, 10, 10, 20, -0.1, 1.0, -0.1, 10])
=[-30,10] x [-30,10] x ... x [-30,-0.1] x [-30,10]
The function f(x,y,r) is the Fisher-Bingham integral on the sphere S^2.
---------------------------
We provide some programs to solve this problem on the computer algebra
system Risa/Asir and Maple
at http://www.math.kobe-u.ac.jp/OpenXM/Math/Fisher-Bingham
(Programs are provided as they are in our study and keep our tries and have
no cosmetics.
A user friendly package of the holonomic gradient descent method will be provided later.)
Instruction to execute this program (on Debian GNU linux)
1. Download all programs with the extension .rr
(sei15c.rr, sei15.rr set15a.rr, sei13.rr)
2. If you do not have Risa/Asir (version >= 20100206), install it:
2.a. Add the line
http://fe.math.kobe-u.ac.jp/KnoppixMath ./
to /etc/apt/sources.list
2.b. sudo su
2.c apt-get update
2.d dpkg --purge openxm
2.e. apt-get install openxm
You do not need Maple to execute the function test5b_demo().
3. Start the Risa/Asir, load sei15c.rr, and execute test5b_demo():
asir
load("sei15c.rr");
test5b_demo();
The starting point of the holonomic gradient descent method is taken at
Pos=[0, 0, 0, 5.5, -20.0, -0.2, 0.5, -15.5, -17.5, 1].
This starting point is found by a numerical integration of the target function
on a coarse grid of the size 0.5 (see mhlml() in sei14c.ml).
During the first execution, the big data file "tmp-sei14c-r1.ab" is
automatically downloaded by "wget". It will take a while.
The file "tmp-sei14c-r1.ab" is the Pfaffian system for the Fisher-Bigham
integral on S^2.
The output of this function will be
[1194,0,[7.05,-2.05,9.95,6.45,-29.95,-0.95,0.95,-29.95,-29.95],[0.0003236947435145229824,0.01365914116495716502,0.0003193051763246178940,0.009267060184740950526,0.00002355671589603190298,-0.00001046867630351169487]]
point = [[x11,7.05],[x12,-2.05],[x13,9.95],[x22,6.45],[x23,-29.95],[x33,-0.95],[y1,0.95],[y2,-29.95],[y3,-29.95]]
int value=1380180060345998.244
I=0
base_replace_n
Runge-kutta
snip
I=8
base_replace_n
Runge-kutta
[[ 7.05 -2.05 9.95 6.45 -29.95 -0.95 0.95 -29.95 -29.95 ],[0.0003236947435145229824,0.01365914116495716502,0.0003193051763246178940,0.009267060184740950526,0.00002355671589603190298,-0.00001046867630351169487]]
This means that the target function takes the minimal
0.0003236947435145229824
at the point
[[x11,7.05],[x12,-2.05],[x13,9.95],[x22,6.45],[x23,-29.95],[x33,-0.95],
[y1,0.95],[y2,-29.95],[y3,-29.95]]
-29.95 is on the border and the point is not in the interior.
If we enlarge the search domain beyond -30, the target value becomes
too small and we have a numerical instability.
-----------------------------------------------