changeset 766:f06d03e1b18b

Initial revision
author david <david>
date Tue, 21 Feb 1995 02:00:20 +0000
parents 409f874f1231
children cf58ba62cbbf
files volume_io/Geometry/newton.c
diffstat 1 files changed, 60 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
new file mode 100644
--- /dev/null
+++ b/volume_io/Geometry/newton.c
@@ -0,0 +1,60 @@
+#include  <internal_volume_io.h>
+
+public  BOOLEAN  invert_function(
+    int    n_dimensions,
+    void   (*function) ( Real parameters[],  Real values[], Real **derivatives),
+    Real   initial_guess[],
+    Real   desired_values[],
+    Real   solution[],
+    Real   tolerance,
+    int    max_iterations )
+{
+    int    iter, dim, i, j;
+    Real   *values, **derivatives;
+
+    ALLOC( values, n_dimensions );
+    ALLOC( delta, n_dimensions );
+    ALLOC2D( derivatives, n_dimensions, n_dimensions );
+
+    for_less( dim, 0, n_dimensions )
+        solution[dim] = initial_guess[dim];
+
+    iter = 0;
+
+    while( max_iterations < 0 || iter < max_iterations )
+    {
+        ++iter;
+
+        (*function) ( solution, values, derivatives );
+
+        error = 0.0;
+        for_less( dim, 0, n_dimensions )
+        {
+            values[dim] = desired_values[dim] - values[dim];
+            error += ABS( values[dim] );
+        }
+
+        if( error < tolerance )
+            break;
+
+        for_less( i, 0, n_dimensions-1 )
+        {
+            for_less( j, i+1, n_dimensions )
+            {
+                derivatives[j][i] = derivatives[i][j];
+            }
+        }
+
+        if( !solve_linear_system( n_dimensions, derivatives, values, delta ) )
+            break;
+
+        for_less( dim, 0, n_dimensions )
+            solution[dim] += delta[dim];
+    }
+
+    FREE( values );
+    FREE( delta );
+    FREE2D( derivatives );
+
+    return( error < tolerance );
+}