annotate liboctave/NLEqn.cc @ 289:c23f50e61c58

[project @ 1994-01-13 06:25:58 by jwe]
author jwe
date Thu, 13 Jan 1994 06:26:54 +0000
parents e208bd9ade36
children 3c23b8ea9099
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
3
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
1 // NLEqn.cc -*- C++ -*-
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
2 /*
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
3
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
4 Copyright (C) 1992, 1993 John W. Eaton
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
5
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
6 This file is part of Octave.
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
7
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
8 Octave is free software; you can redistribute it and/or modify it
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
9 under the terms of the GNU General Public License as published by the
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
10 Free Software Foundation; either version 2, or (at your option) any
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
11 later version.
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
12
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
13 Octave is distributed in the hope that it will be useful, but WITHOUT
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
14 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
16 for more details.
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
17
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
18 You should have received a copy of the GNU General Public License
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
19 along with Octave; see the file COPYING. If not, write to the Free
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
20 Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
21
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
22 */
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
23
238
780cbbc57b7c [project @ 1993-11-30 20:23:04 by jwe]
jwe
parents: 227
diff changeset
24 #ifdef HAVE_CONFIG_H
780cbbc57b7c [project @ 1993-11-30 20:23:04 by jwe]
jwe
parents: 227
diff changeset
25 #include "config.h"
3
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
26 #endif
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
27
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
28 #include <float.h>
238
780cbbc57b7c [project @ 1993-11-30 20:23:04 by jwe]
jwe
parents: 227
diff changeset
29
3
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
30 #include "NLEqn.h"
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
31 #include "f77-uscore.h"
227
1a48a1b91489 [project @ 1993-11-15 10:10:35 by jwe]
jwe
parents: 190
diff changeset
32 #include "lo-error.h"
3
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
33
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
34 extern "C"
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
35 {
253
e208bd9ade36 [project @ 1993-12-06 22:01:37 by jwe]
jwe
parents: 238
diff changeset
36 int F77_FCN (hybrd1) (int (*)(int*, double*, double*, int*),
e208bd9ade36 [project @ 1993-12-06 22:01:37 by jwe]
jwe
parents: 238
diff changeset
37 const int*, double*, double*, const double*,
e208bd9ade36 [project @ 1993-12-06 22:01:37 by jwe]
jwe
parents: 238
diff changeset
38 int*, double*, const int*);
3
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
39
253
e208bd9ade36 [project @ 1993-12-06 22:01:37 by jwe]
jwe
parents: 238
diff changeset
40 int F77_FCN (hybrj1) (int (*)(int*, double*, double*, double*, int*, int*),
e208bd9ade36 [project @ 1993-12-06 22:01:37 by jwe]
jwe
parents: 238
diff changeset
41 const int*, double*, double*, double*, const int*,
e208bd9ade36 [project @ 1993-12-06 22:01:37 by jwe]
jwe
parents: 238
diff changeset
42 const double*, int*, double*, const int*);
3
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
43 }
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
44
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
45 static nonlinear_fcn user_fun;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
46 static jacobian_fcn user_jac;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
47
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
48 // error handling
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
49
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
50 void
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
51 NLEqn::error (const char* msg)
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
52 {
227
1a48a1b91489 [project @ 1993-11-15 10:10:35 by jwe]
jwe
parents: 190
diff changeset
53 (*current_liboctave_error_handler) ("fatal NLEqn error: %s", msg);
3
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
54 }
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
55
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
56 // Constructors
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
57
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
58 NLEqn::NLEqn (void) : NLFunc (), x (), n (0) {}
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
59
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
60 NLEqn::NLEqn (const Vector& xvec, const NLFunc f)
190
edfb6cafe85d [project @ 1993-10-29 20:32:05 by jwe]
jwe
parents: 3
diff changeset
61 : NLFunc (f), x (xvec), n (xvec.capacity ()) {}
3
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
62
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
63 NLEqn::NLEqn (const NLEqn& a) : NLFunc (a.fun, a.jac), x (a.x), n (a.n) {}
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
64
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
65 void
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
66 NLEqn::resize (int nn)
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
67 {
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
68 if (n != nn)
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
69 {
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
70 n = nn;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
71 x.resize (n);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
72 }
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
73 }
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
74
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
75 int
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
76 NLEqn::size (void) const
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
77 {
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
78 return n;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
79 }
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
80
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
81 // Assignment
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
82
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
83 NLEqn&
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
84 NLEqn::operator = (const NLEqn& a)
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
85 {
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
86 fun = a.fun;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
87 jac = a.jac;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
88 x = a.n;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
89
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
90 return *this;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
91 }
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
92
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
93 Vector
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
94 NLEqn::states (void) const
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
95 {
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
96 return x;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
97 }
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
98
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
99 void
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
100 NLEqn::set_states (const Vector& xvec)
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
101 {
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
102 if (xvec.capacity () != n)
227
1a48a1b91489 [project @ 1993-11-15 10:10:35 by jwe]
jwe
parents: 190
diff changeset
103 {
1a48a1b91489 [project @ 1993-11-15 10:10:35 by jwe]
jwe
parents: 190
diff changeset
104 error ("dimension error");
1a48a1b91489 [project @ 1993-11-15 10:10:35 by jwe]
jwe
parents: 190
diff changeset
105 return;
1a48a1b91489 [project @ 1993-11-15 10:10:35 by jwe]
jwe
parents: 190
diff changeset
106 }
3
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
107
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
108 x = xvec;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
109 }
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
110
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
111 // Other operations
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
112
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
113 Vector
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
114 NLEqn::solve (const Vector& xvec)
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
115 {
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
116 set_states (xvec);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
117 int info;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
118 return solve (info);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
119 }
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
120
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
121 Vector
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
122 NLEqn::solve (const Vector& xvec, int& info)
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
123 {
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
124 set_states (xvec);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
125 return solve (info);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
126 }
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
127
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
128 Vector
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
129 NLEqn::solve (void)
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
130 {
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
131 int info;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
132 return solve (info);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
133 }
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
134
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
135 int
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
136 hybrd1_fcn (int *n, double *x, double *fvec, int *iflag)
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
137 {
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
138 int nn = *n;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
139 Vector tmp_f (nn);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
140 Vector tmp_x (nn);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
141
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
142 for (int i = 0; i < nn; i++)
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
143 tmp_x.elem (i) = x[i];
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
144
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
145 tmp_f = (*user_fun) (tmp_x);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
146
253
e208bd9ade36 [project @ 1993-12-06 22:01:37 by jwe]
jwe
parents: 238
diff changeset
147 if (tmp_f.length () == 0)
e208bd9ade36 [project @ 1993-12-06 22:01:37 by jwe]
jwe
parents: 238
diff changeset
148 *iflag = -1;
e208bd9ade36 [project @ 1993-12-06 22:01:37 by jwe]
jwe
parents: 238
diff changeset
149 else
e208bd9ade36 [project @ 1993-12-06 22:01:37 by jwe]
jwe
parents: 238
diff changeset
150 {
e208bd9ade36 [project @ 1993-12-06 22:01:37 by jwe]
jwe
parents: 238
diff changeset
151 for (i = 0; i < nn; i++)
e208bd9ade36 [project @ 1993-12-06 22:01:37 by jwe]
jwe
parents: 238
diff changeset
152 fvec[i] = tmp_f.elem (i);
e208bd9ade36 [project @ 1993-12-06 22:01:37 by jwe]
jwe
parents: 238
diff changeset
153 }
3
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
154
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
155 return 0;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
156 }
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
157
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
158 int
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
159 hybrj1_fcn (int *n, double *x, double *fvec, double *fjac,
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
160 int *ldfjac, int *iflag)
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
161 {
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
162 int nn = *n;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
163 Vector tmp_x (nn);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
164
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
165 for (int i = 0; i < nn; i++)
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
166 tmp_x.elem (i) = x[i];
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
167
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
168 int flag = *iflag;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
169 if (flag == 1)
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
170 {
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
171 Vector tmp_f (nn);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
172
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
173 tmp_f = (*user_fun) (tmp_x);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
174
253
e208bd9ade36 [project @ 1993-12-06 22:01:37 by jwe]
jwe
parents: 238
diff changeset
175 if (tmp_f.length () == 0)
e208bd9ade36 [project @ 1993-12-06 22:01:37 by jwe]
jwe
parents: 238
diff changeset
176 *iflag = -1;
e208bd9ade36 [project @ 1993-12-06 22:01:37 by jwe]
jwe
parents: 238
diff changeset
177 else
e208bd9ade36 [project @ 1993-12-06 22:01:37 by jwe]
jwe
parents: 238
diff changeset
178 {
e208bd9ade36 [project @ 1993-12-06 22:01:37 by jwe]
jwe
parents: 238
diff changeset
179 for (i = 0; i < nn; i++)
e208bd9ade36 [project @ 1993-12-06 22:01:37 by jwe]
jwe
parents: 238
diff changeset
180 fvec[i] = tmp_f.elem (i);
e208bd9ade36 [project @ 1993-12-06 22:01:37 by jwe]
jwe
parents: 238
diff changeset
181 }
3
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
182 }
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
183 else
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
184 {
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
185 Matrix tmp_fj (nn, nn);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
186
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
187 tmp_fj = (*user_jac) (tmp_x);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
188
253
e208bd9ade36 [project @ 1993-12-06 22:01:37 by jwe]
jwe
parents: 238
diff changeset
189 if (tmp_fj.rows () == 0 || tmp_fj.columns () == 0)
e208bd9ade36 [project @ 1993-12-06 22:01:37 by jwe]
jwe
parents: 238
diff changeset
190 *iflag = -1;
e208bd9ade36 [project @ 1993-12-06 22:01:37 by jwe]
jwe
parents: 238
diff changeset
191 else
e208bd9ade36 [project @ 1993-12-06 22:01:37 by jwe]
jwe
parents: 238
diff changeset
192 {
e208bd9ade36 [project @ 1993-12-06 22:01:37 by jwe]
jwe
parents: 238
diff changeset
193 int ld = *ldfjac;
e208bd9ade36 [project @ 1993-12-06 22:01:37 by jwe]
jwe
parents: 238
diff changeset
194 for (int j = 0; j < nn; j++)
e208bd9ade36 [project @ 1993-12-06 22:01:37 by jwe]
jwe
parents: 238
diff changeset
195 for (i = 0; i < nn; i++)
e208bd9ade36 [project @ 1993-12-06 22:01:37 by jwe]
jwe
parents: 238
diff changeset
196 fjac[j*ld+i] = tmp_fj.elem (i, j);
e208bd9ade36 [project @ 1993-12-06 22:01:37 by jwe]
jwe
parents: 238
diff changeset
197 }
3
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
198 }
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
199
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
200 return 0;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
201 }
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
202
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
203 Vector
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
204 NLEqn::solve (int& info)
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
205 {
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
206 int tmp_info = 0;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
207
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
208 if (n == 0)
227
1a48a1b91489 [project @ 1993-11-15 10:10:35 by jwe]
jwe
parents: 190
diff changeset
209 {
1a48a1b91489 [project @ 1993-11-15 10:10:35 by jwe]
jwe
parents: 190
diff changeset
210 error ("equation set not initialized");
1a48a1b91489 [project @ 1993-11-15 10:10:35 by jwe]
jwe
parents: 190
diff changeset
211 return Vector ();
1a48a1b91489 [project @ 1993-11-15 10:10:35 by jwe]
jwe
parents: 190
diff changeset
212 }
3
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
213
289
c23f50e61c58 [project @ 1994-01-13 06:25:58 by jwe]
jwe
parents: 253
diff changeset
214 double tol = tolerance ();
3
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
215
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
216 double *fvec = new double [n];
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
217 double *px = new double [n];
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
218 for (int i = 0; i < n; i++)
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
219 px[i] = x.elem (i);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
220
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
221 user_fun = fun;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
222 user_jac = jac;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
223
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
224 if (jac == NULL)
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
225 {
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
226 int lwa = (n*(3*n+13))/2;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
227 double *wa = new double [lwa];
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
228
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
229 F77_FCN (hybrd1) (hybrd1_fcn, &n, px, fvec, &tol, &tmp_info, wa, &lwa);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
230
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
231 delete [] wa;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
232 }
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
233 else
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
234 {
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
235 int lwa = (n*(n+13))/2;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
236 double *wa = new double [lwa];
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
237 double *fjac = new double [n*n];
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
238
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
239 F77_FCN (hybrj1) (hybrj1_fcn, &n, px, fvec, fjac, &n, &tol,
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
240 &tmp_info, wa, &lwa);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
241
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
242 delete [] wa;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
243 delete [] fjac;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
244 }
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
245
253
e208bd9ade36 [project @ 1993-12-06 22:01:37 by jwe]
jwe
parents: 238
diff changeset
246 Vector retval;
e208bd9ade36 [project @ 1993-12-06 22:01:37 by jwe]
jwe
parents: 238
diff changeset
247
3
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
248 info = tmp_info;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
249
253
e208bd9ade36 [project @ 1993-12-06 22:01:37 by jwe]
jwe
parents: 238
diff changeset
250 if (info >= 0)
e208bd9ade36 [project @ 1993-12-06 22:01:37 by jwe]
jwe
parents: 238
diff changeset
251 {
e208bd9ade36 [project @ 1993-12-06 22:01:37 by jwe]
jwe
parents: 238
diff changeset
252 retval.resize (n);
3
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
253
253
e208bd9ade36 [project @ 1993-12-06 22:01:37 by jwe]
jwe
parents: 238
diff changeset
254 for (i = 0; i < n; i++)
e208bd9ade36 [project @ 1993-12-06 22:01:37 by jwe]
jwe
parents: 238
diff changeset
255 retval.elem (i) = px[i];
e208bd9ade36 [project @ 1993-12-06 22:01:37 by jwe]
jwe
parents: 238
diff changeset
256 }
3
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
257
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
258 return retval;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
259 }
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
260
289
c23f50e61c58 [project @ 1994-01-13 06:25:58 by jwe]
jwe
parents: 253
diff changeset
261 NLEqn_options::NLEqn_options (void)
c23f50e61c58 [project @ 1994-01-13 06:25:58 by jwe]
jwe
parents: 253
diff changeset
262 {
c23f50e61c58 [project @ 1994-01-13 06:25:58 by jwe]
jwe
parents: 253
diff changeset
263 init ();
c23f50e61c58 [project @ 1994-01-13 06:25:58 by jwe]
jwe
parents: 253
diff changeset
264 }
c23f50e61c58 [project @ 1994-01-13 06:25:58 by jwe]
jwe
parents: 253
diff changeset
265
c23f50e61c58 [project @ 1994-01-13 06:25:58 by jwe]
jwe
parents: 253
diff changeset
266 NLEqn_options::NLEqn_options (const NLEqn_options& opt)
c23f50e61c58 [project @ 1994-01-13 06:25:58 by jwe]
jwe
parents: 253
diff changeset
267 {
c23f50e61c58 [project @ 1994-01-13 06:25:58 by jwe]
jwe
parents: 253
diff changeset
268 copy (opt);
c23f50e61c58 [project @ 1994-01-13 06:25:58 by jwe]
jwe
parents: 253
diff changeset
269 }
c23f50e61c58 [project @ 1994-01-13 06:25:58 by jwe]
jwe
parents: 253
diff changeset
270
c23f50e61c58 [project @ 1994-01-13 06:25:58 by jwe]
jwe
parents: 253
diff changeset
271 NLEqn_options&
c23f50e61c58 [project @ 1994-01-13 06:25:58 by jwe]
jwe
parents: 253
diff changeset
272 NLEqn_options::operator = (const NLEqn_options& opt)
c23f50e61c58 [project @ 1994-01-13 06:25:58 by jwe]
jwe
parents: 253
diff changeset
273 {
c23f50e61c58 [project @ 1994-01-13 06:25:58 by jwe]
jwe
parents: 253
diff changeset
274 if (this != &opt)
c23f50e61c58 [project @ 1994-01-13 06:25:58 by jwe]
jwe
parents: 253
diff changeset
275 copy (opt);
c23f50e61c58 [project @ 1994-01-13 06:25:58 by jwe]
jwe
parents: 253
diff changeset
276
c23f50e61c58 [project @ 1994-01-13 06:25:58 by jwe]
jwe
parents: 253
diff changeset
277 return *this;
c23f50e61c58 [project @ 1994-01-13 06:25:58 by jwe]
jwe
parents: 253
diff changeset
278 }
c23f50e61c58 [project @ 1994-01-13 06:25:58 by jwe]
jwe
parents: 253
diff changeset
279
c23f50e61c58 [project @ 1994-01-13 06:25:58 by jwe]
jwe
parents: 253
diff changeset
280 NLEqn_options::~NLEqn_options (void)
c23f50e61c58 [project @ 1994-01-13 06:25:58 by jwe]
jwe
parents: 253
diff changeset
281 {
c23f50e61c58 [project @ 1994-01-13 06:25:58 by jwe]
jwe
parents: 253
diff changeset
282 }
c23f50e61c58 [project @ 1994-01-13 06:25:58 by jwe]
jwe
parents: 253
diff changeset
283
c23f50e61c58 [project @ 1994-01-13 06:25:58 by jwe]
jwe
parents: 253
diff changeset
284 void
c23f50e61c58 [project @ 1994-01-13 06:25:58 by jwe]
jwe
parents: 253
diff changeset
285 NLEqn_options::init (void)
c23f50e61c58 [project @ 1994-01-13 06:25:58 by jwe]
jwe
parents: 253
diff changeset
286 {
c23f50e61c58 [project @ 1994-01-13 06:25:58 by jwe]
jwe
parents: 253
diff changeset
287 double sqrt_eps = sqrt (DBL_EPSILON);
c23f50e61c58 [project @ 1994-01-13 06:25:58 by jwe]
jwe
parents: 253
diff changeset
288 x_tolerance = sqrt_eps;
c23f50e61c58 [project @ 1994-01-13 06:25:58 by jwe]
jwe
parents: 253
diff changeset
289 }
c23f50e61c58 [project @ 1994-01-13 06:25:58 by jwe]
jwe
parents: 253
diff changeset
290
c23f50e61c58 [project @ 1994-01-13 06:25:58 by jwe]
jwe
parents: 253
diff changeset
291 void
c23f50e61c58 [project @ 1994-01-13 06:25:58 by jwe]
jwe
parents: 253
diff changeset
292 NLEqn_options::copy (const NLEqn_options& opt)
c23f50e61c58 [project @ 1994-01-13 06:25:58 by jwe]
jwe
parents: 253
diff changeset
293 {
c23f50e61c58 [project @ 1994-01-13 06:25:58 by jwe]
jwe
parents: 253
diff changeset
294 x_tolerance = opt.x_tolerance;
c23f50e61c58 [project @ 1994-01-13 06:25:58 by jwe]
jwe
parents: 253
diff changeset
295 }
c23f50e61c58 [project @ 1994-01-13 06:25:58 by jwe]
jwe
parents: 253
diff changeset
296
c23f50e61c58 [project @ 1994-01-13 06:25:58 by jwe]
jwe
parents: 253
diff changeset
297 void
c23f50e61c58 [project @ 1994-01-13 06:25:58 by jwe]
jwe
parents: 253
diff changeset
298 NLEqn_options::set_default_options (void)
c23f50e61c58 [project @ 1994-01-13 06:25:58 by jwe]
jwe
parents: 253
diff changeset
299 {
c23f50e61c58 [project @ 1994-01-13 06:25:58 by jwe]
jwe
parents: 253
diff changeset
300 init ();
c23f50e61c58 [project @ 1994-01-13 06:25:58 by jwe]
jwe
parents: 253
diff changeset
301 }
c23f50e61c58 [project @ 1994-01-13 06:25:58 by jwe]
jwe
parents: 253
diff changeset
302
c23f50e61c58 [project @ 1994-01-13 06:25:58 by jwe]
jwe
parents: 253
diff changeset
303 void
c23f50e61c58 [project @ 1994-01-13 06:25:58 by jwe]
jwe
parents: 253
diff changeset
304 NLEqn_options::set_tolerance (double val)
c23f50e61c58 [project @ 1994-01-13 06:25:58 by jwe]
jwe
parents: 253
diff changeset
305 {
c23f50e61c58 [project @ 1994-01-13 06:25:58 by jwe]
jwe
parents: 253
diff changeset
306 x_tolerance = (val > 0.0) ? val : sqrt (DBL_EPSILON);
c23f50e61c58 [project @ 1994-01-13 06:25:58 by jwe]
jwe
parents: 253
diff changeset
307 }
c23f50e61c58 [project @ 1994-01-13 06:25:58 by jwe]
jwe
parents: 253
diff changeset
308
c23f50e61c58 [project @ 1994-01-13 06:25:58 by jwe]
jwe
parents: 253
diff changeset
309 double
c23f50e61c58 [project @ 1994-01-13 06:25:58 by jwe]
jwe
parents: 253
diff changeset
310 NLEqn_options::tolerance (void)
c23f50e61c58 [project @ 1994-01-13 06:25:58 by jwe]
jwe
parents: 253
diff changeset
311 {
c23f50e61c58 [project @ 1994-01-13 06:25:58 by jwe]
jwe
parents: 253
diff changeset
312 return x_tolerance;
c23f50e61c58 [project @ 1994-01-13 06:25:58 by jwe]
jwe
parents: 253
diff changeset
313 }
c23f50e61c58 [project @ 1994-01-13 06:25:58 by jwe]
jwe
parents: 253
diff changeset
314
3
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
315 /*
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
316 ;;; Local Variables: ***
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
317 ;;; mode: C++ ***
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
318 ;;; page-delimiter: "^/\\*" ***
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
319 ;;; End: ***
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
320 */