1 | // $Id: solver.lib,v 1.3 1999-07-06 15:32:58 Singular Exp $ |
---|
2 | //////////////////////////////////////////////////////////////////////////////// |
---|
3 | // solver.lib // |
---|
4 | // algorithms for solving algebraic system of dimension zero // |
---|
5 | // written by Dietmar Hillebrand and ... // |
---|
6 | // // |
---|
7 | //////////////////////////////////////////////////////////////////////////////// |
---|
8 | |
---|
9 | version="$Id: solver.lib,v 1.3 1999-07-06 15:32:58 Singular Exp $"; |
---|
10 | info=" |
---|
11 | LIBRARY: solver.lib: PROCEDURES FOR SOLVING ZERO-DIMENSIONAL ALGEBRAIC SYSTEMS |
---|
12 | AUTHOR: Dietmar Hillebrand |
---|
13 | |
---|
14 | PROCEDURES: |
---|
15 | triMNewton(G,a,err,itb); computes an improved approximation for |
---|
16 | a common zero of the triangular system G |
---|
17 | via multivariate Newton. |
---|
18 | "; |
---|
19 | |
---|
20 | |
---|
21 | /////////////////////////////////////////////////////////////////////////////// |
---|
22 | // |
---|
23 | // Multivariate Newton for triangular systems |
---|
24 | // |
---|
25 | // |
---|
26 | /////////////////////////////////////////////////////////////////////////////// |
---|
27 | |
---|
28 | proc triMNewton (ideal G, list a, number err, int itb) |
---|
29 | "USAGE: triMNewtion(G,a,err,itb); |
---|
30 | ideal G=g1,..,gn, a triangular system |
---|
31 | in n vars, i.e gi=gi(var(n-i+1),..,var(n)); |
---|
32 | list of numbers a, an approximation of a common zero of G, |
---|
33 | (a[i] to be substituted in var(i)); |
---|
34 | number err, an error bound; |
---|
35 | int itb, the maximal number of iterations performed. |
---|
36 | RETURN: an improved approximation for a common zero of G; |
---|
37 | EXAMPLE: example triMNewton; shows an example |
---|
38 | " |
---|
39 | { |
---|
40 | if (itb == 0) |
---|
41 | { |
---|
42 | dbprint("iteration bound performed!"); |
---|
43 | return(a); |
---|
44 | } |
---|
45 | |
---|
46 | int i,j,k; |
---|
47 | ideal p=G; |
---|
48 | matrix J=jacob(G); |
---|
49 | list h; |
---|
50 | poly hh; |
---|
51 | int fertig=1; |
---|
52 | int n=nvars(basering); |
---|
53 | |
---|
54 | for (i = 1; i <= n; i++) |
---|
55 | { |
---|
56 | for (j = n; j >= n-i+1; j--) |
---|
57 | { |
---|
58 | p[i] = subst(p[i],var(j),a[j]); |
---|
59 | for (k = n; k >= n-i+1; k--) |
---|
60 | { |
---|
61 | J[i,k] = subst(J[i,k],var(j),a[j]); |
---|
62 | } |
---|
63 | } |
---|
64 | if (J[i,n-i+1] == 0) |
---|
65 | { |
---|
66 | print("Error: ideal not radical!"); |
---|
67 | return(); |
---|
68 | } |
---|
69 | |
---|
70 | // solve linear equations |
---|
71 | hh = -p[i]; |
---|
72 | for (j = n; j >= n-i+2; j--) |
---|
73 | { |
---|
74 | hh = hh - J[i,j]*h[j]; |
---|
75 | } |
---|
76 | h[n-i+1] = number(hh/J[i,n-i+1]); |
---|
77 | } |
---|
78 | |
---|
79 | for (i = 1; i <= n; i++) |
---|
80 | { |
---|
81 | if ( abs(h[i]) > err) |
---|
82 | { |
---|
83 | fertig = 0; |
---|
84 | break; |
---|
85 | } |
---|
86 | } |
---|
87 | if ( not fertig ) |
---|
88 | { |
---|
89 | for (i = 1; i <= n; i++) |
---|
90 | { |
---|
91 | a[i] = a[i] + h[i]; |
---|
92 | } |
---|
93 | return(triMNewton(G,a,err,itb-1)); |
---|
94 | } |
---|
95 | else |
---|
96 | { |
---|
97 | return(a); |
---|
98 | } |
---|
99 | } |
---|
100 | example |
---|
101 | { "EXAMPLE:"; echo = 2; |
---|
102 | ring r=real,(z,y,x),(lp); |
---|
103 | ideal i=x^2-1,y^2+x4-3,z2-y4+x-1; |
---|
104 | list a=2,3,4; |
---|
105 | number e=1.0e-10; |
---|
106 | |
---|
107 | list l = triMNewton(i,a,e,20); |
---|
108 | l; |
---|
109 | } |
---|
110 | |
---|
111 | |
---|
112 | //////////////////////////////////////////////////////////////////////////////// |
---|
113 | |
---|
114 | static proc abs( number r) |
---|
115 | { |
---|
116 | if (r >= 0) |
---|
117 | { |
---|
118 | return(r); |
---|
119 | } |
---|
120 | else |
---|
121 | { |
---|
122 | return(-r); |
---|
123 | } |
---|
124 | } |
---|
125 | |
---|