annotate src/DLD-FUNCTIONS/fsolve.cc @ 7924:4976f66d469b

miscellaneous cleanup
author John W. Eaton <jwe@octave.org>
date Fri, 11 Jul 2008 17:59:28 -0400
parents 7ca2735d74c2
children 44d206ae68c9
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2928
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
1 /*
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
2
7017
a1dbe9d80eee [project @ 2007-10-12 21:27:11 by jwe]
jwe
parents: 7016
diff changeset
3 Copyright (C) 1996, 1997, 1998, 1999, 2000, 2002, 2003, 2005, 2006,
a1dbe9d80eee [project @ 2007-10-12 21:27:11 by jwe]
jwe
parents: 7016
diff changeset
4 2007 John W. Eaton
2928
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
5
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
6 This file is part of Octave.
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
7
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
8 Octave is free software; you can redistribute it and/or modify it
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
9 under the terms of the GNU General Public License as published by the
7016
93c65f2a5668 [project @ 2007-10-12 06:40:56 by jwe]
jwe
parents: 5859
diff changeset
10 Free Software Foundation; either version 3 of the License, or (at your
93c65f2a5668 [project @ 2007-10-12 06:40:56 by jwe]
jwe
parents: 5859
diff changeset
11 option) any later version.
2928
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
12
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
13 Octave is distributed in the hope that it will be useful, but WITHOUT
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
14 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
16 for more details.
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
17
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
18 You should have received a copy of the GNU General Public License
7016
93c65f2a5668 [project @ 2007-10-12 06:40:56 by jwe]
jwe
parents: 5859
diff changeset
19 along with Octave; see the file COPYING. If not, see
93c65f2a5668 [project @ 2007-10-12 06:40:56 by jwe]
jwe
parents: 5859
diff changeset
20 <http://www.gnu.org/licenses/>.
2928
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
21
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
22 */
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
23
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
24 #ifdef HAVE_CONFIG_H
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
25 #include <config.h>
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
26 #endif
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
27
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
28 #include <string>
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
29
3567
dd8998699aa8 [project @ 2000-02-03 09:54:28 by jwe]
jwe
parents: 3544
diff changeset
30 #include <iomanip>
3523
b80bbb43a1a9 [project @ 2000-02-02 10:25:52 by jwe]
jwe
parents: 3419
diff changeset
31 #include <iostream>
5856
a4dc99e71752 [project @ 2006-06-13 15:52:27 by jwe]
jwe
parents: 5823
diff changeset
32 #include <sstream>
2928
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
33
7892
7ca2735d74c2 simplify & cleanup octave_value::XXX_vector_value functions
Jaroslav Hajek <highegg@gmail.com>
parents: 7509
diff changeset
34 #include "dNDArray.h"
2928
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
35 #include "NLEqn.h"
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
36
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
37 #include "defun-dld.h"
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
38 #include "error.h"
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
39 #include "gripes.h"
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
40 #include "oct-obj.h"
2968
e330cb788508 [project @ 1997-05-15 17:40:29 by jwe]
jwe
parents: 2928
diff changeset
41 #include "ov-fcn.h"
5729
e065f7c18bdc [project @ 2006-04-03 19:03:30 by jwe]
jwe
parents: 5307
diff changeset
42 #include "ov-cell.h"
2928
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
43 #include "pager.h"
3243
dd00769643ae [project @ 1999-05-28 04:19:00 by jwe]
jwe
parents: 3148
diff changeset
44 #include "unwind-prot.h"
2928
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
45 #include "utils.h"
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
46 #include "variables.h"
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
47
3998
f6df65db67f9 [project @ 2002-07-24 18:10:39 by jwe]
jwe
parents: 3971
diff changeset
48 #include "NLEqn-opts.cc"
f6df65db67f9 [project @ 2002-07-24 18:10:39 by jwe]
jwe
parents: 3971
diff changeset
49
2928
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
50 // Global pointer for user defined function required by hybrd1.
2968
e330cb788508 [project @ 1997-05-15 17:40:29 by jwe]
jwe
parents: 2928
diff changeset
51 static octave_function *fsolve_fcn;
2928
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
52
4140
303b28a7a7e4 [project @ 2002-11-01 02:53:13 by jwe]
jwe
parents: 4139
diff changeset
53 // Global pointer for optional user defined jacobian function.
303b28a7a7e4 [project @ 2002-11-01 02:53:13 by jwe]
jwe
parents: 4139
diff changeset
54 static octave_function *fsolve_jac;
303b28a7a7e4 [project @ 2002-11-01 02:53:13 by jwe]
jwe
parents: 4139
diff changeset
55
7892
7ca2735d74c2 simplify & cleanup octave_value::XXX_vector_value functions
Jaroslav Hajek <highegg@gmail.com>
parents: 7509
diff changeset
56 // Original dimensions of X0.
7ca2735d74c2 simplify & cleanup octave_value::XXX_vector_value functions
Jaroslav Hajek <highegg@gmail.com>
parents: 7509
diff changeset
57 static dim_vector x_dims;
7ca2735d74c2 simplify & cleanup octave_value::XXX_vector_value functions
Jaroslav Hajek <highegg@gmail.com>
parents: 7509
diff changeset
58
4139
02ca908056e9 [project @ 2002-11-01 00:49:13 by jwe]
jwe
parents: 4132
diff changeset
59 // Have we warned about imaginary values returned from user function?
4140
303b28a7a7e4 [project @ 2002-11-01 02:53:13 by jwe]
jwe
parents: 4139
diff changeset
60 static bool warned_fcn_imaginary = false;
303b28a7a7e4 [project @ 2002-11-01 02:53:13 by jwe]
jwe
parents: 4139
diff changeset
61 static bool warned_jac_imaginary = false;
4139
02ca908056e9 [project @ 2002-11-01 00:49:13 by jwe]
jwe
parents: 4132
diff changeset
62
3243
dd00769643ae [project @ 1999-05-28 04:19:00 by jwe]
jwe
parents: 3148
diff changeset
63 // Is this a recursive call?
dd00769643ae [project @ 1999-05-28 04:19:00 by jwe]
jwe
parents: 3148
diff changeset
64 static int call_depth = 0;
dd00769643ae [project @ 1999-05-28 04:19:00 by jwe]
jwe
parents: 3148
diff changeset
65
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 4628
diff changeset
66 octave_idx_type
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 4628
diff changeset
67 hybrd_info_to_fsolve_info (octave_idx_type info)
2928
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
68 {
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
69 switch (info)
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
70 {
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
71 case -1:
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
72 break;
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
73
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
74 case 0:
7359
8fb8d6985395 [project @ 2008-01-11 02:40:46 by jwe]
jwe
parents: 7279
diff changeset
75 info = -2;
2928
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
76 break;
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
77
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
78 case 1:
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
79 break;
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
80
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
81 case 2:
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
82 info = 4;
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
83 break;
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
84
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
85 case 3:
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
86 case 4:
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
87 case 5:
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
88 info = 3;
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
89 break;
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
90
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
91 default:
5856
a4dc99e71752 [project @ 2006-06-13 15:52:27 by jwe]
jwe
parents: 5823
diff changeset
92 {
a4dc99e71752 [project @ 2006-06-13 15:52:27 by jwe]
jwe
parents: 5823
diff changeset
93 std::ostringstream buf;
a4dc99e71752 [project @ 2006-06-13 15:52:27 by jwe]
jwe
parents: 5823
diff changeset
94 buf << "fsolve: unrecognized value of INFO from MINPACK (= "
a4dc99e71752 [project @ 2006-06-13 15:52:27 by jwe]
jwe
parents: 5823
diff changeset
95 << info << ")";
a4dc99e71752 [project @ 2006-06-13 15:52:27 by jwe]
jwe
parents: 5823
diff changeset
96 std::string msg = buf.str ();
a4dc99e71752 [project @ 2006-06-13 15:52:27 by jwe]
jwe
parents: 5823
diff changeset
97 warning (msg.c_str ());
a4dc99e71752 [project @ 2006-06-13 15:52:27 by jwe]
jwe
parents: 5823
diff changeset
98 }
2928
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
99 break;
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
100 }
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
101
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
102 return info;
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
103 }
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
104
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
105 ColumnVector
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
106 fsolve_user_function (const ColumnVector& x)
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
107 {
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
108 ColumnVector retval;
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
109
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 4628
diff changeset
110 octave_idx_type n = x.length ();
2928
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
111
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
112 octave_value_list args;
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
113 args.resize (1);
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
114
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
115 if (n > 1)
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
116 {
7892
7ca2735d74c2 simplify & cleanup octave_value::XXX_vector_value functions
Jaroslav Hajek <highegg@gmail.com>
parents: 7509
diff changeset
117 NDArray m (ArrayN<double> (x, x_dims));
2928
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
118 octave_value vars (m);
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
119 args(0) = vars;
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
120 }
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
121 else
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
122 {
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
123 double d = x (0);
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
124 octave_value vars (d);
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
125 args(0) = vars;
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
126 }
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
127
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
128 if (fsolve_fcn)
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
129 {
3544
71bd2d124119 [project @ 2000-02-02 21:02:31 by jwe]
jwe
parents: 3523
diff changeset
130 octave_value_list tmp = fsolve_fcn->do_multi_index_op (1, args);
4139
02ca908056e9 [project @ 2002-11-01 00:49:13 by jwe]
jwe
parents: 4132
diff changeset
131
2928
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
132 if (tmp.length () > 0 && tmp(0).is_defined ())
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
133 {
4140
303b28a7a7e4 [project @ 2002-11-01 02:53:13 by jwe]
jwe
parents: 4139
diff changeset
134 if (! warned_fcn_imaginary && tmp(0).is_complex_type ())
4139
02ca908056e9 [project @ 2002-11-01 00:49:13 by jwe]
jwe
parents: 4132
diff changeset
135 {
02ca908056e9 [project @ 2002-11-01 00:49:13 by jwe]
jwe
parents: 4132
diff changeset
136 warning ("fsolve: ignoring imaginary part returned from user-supplied function");
4140
303b28a7a7e4 [project @ 2002-11-01 02:53:13 by jwe]
jwe
parents: 4139
diff changeset
137 warned_fcn_imaginary = true;
4139
02ca908056e9 [project @ 2002-11-01 00:49:13 by jwe]
jwe
parents: 4132
diff changeset
138 }
02ca908056e9 [project @ 2002-11-01 00:49:13 by jwe]
jwe
parents: 4132
diff changeset
139
7892
7ca2735d74c2 simplify & cleanup octave_value::XXX_vector_value functions
Jaroslav Hajek <highegg@gmail.com>
parents: 7509
diff changeset
140 retval = ColumnVector (tmp(0).vector_value (false, true));
2928
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
141
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
142 if (error_state || retval.length () <= 0)
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
143 gripe_user_supplied_eval ("fsolve");
7509
e41d6aff83ea fsolve: detect nonsquare systems
John W. Eaton <jwe@octave.org>
parents: 7359
diff changeset
144 else if (retval.length () != x.length ())
e41d6aff83ea fsolve: detect nonsquare systems
John W. Eaton <jwe@octave.org>
parents: 7359
diff changeset
145 error ("fsolve: unable to solve non-square systems");
2928
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
146 }
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
147 else
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
148 gripe_user_supplied_eval ("fsolve");
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
149 }
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
150
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
151 return retval;
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
152 }
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
153
4140
303b28a7a7e4 [project @ 2002-11-01 02:53:13 by jwe]
jwe
parents: 4139
diff changeset
154 Matrix
303b28a7a7e4 [project @ 2002-11-01 02:53:13 by jwe]
jwe
parents: 4139
diff changeset
155 fsolve_user_jacobian (const ColumnVector& x)
303b28a7a7e4 [project @ 2002-11-01 02:53:13 by jwe]
jwe
parents: 4139
diff changeset
156 {
303b28a7a7e4 [project @ 2002-11-01 02:53:13 by jwe]
jwe
parents: 4139
diff changeset
157 Matrix retval;
303b28a7a7e4 [project @ 2002-11-01 02:53:13 by jwe]
jwe
parents: 4139
diff changeset
158
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 4628
diff changeset
159 octave_idx_type n = x.length ();
4140
303b28a7a7e4 [project @ 2002-11-01 02:53:13 by jwe]
jwe
parents: 4139
diff changeset
160
303b28a7a7e4 [project @ 2002-11-01 02:53:13 by jwe]
jwe
parents: 4139
diff changeset
161 octave_value_list args;
303b28a7a7e4 [project @ 2002-11-01 02:53:13 by jwe]
jwe
parents: 4139
diff changeset
162 args.resize (1);
303b28a7a7e4 [project @ 2002-11-01 02:53:13 by jwe]
jwe
parents: 4139
diff changeset
163
303b28a7a7e4 [project @ 2002-11-01 02:53:13 by jwe]
jwe
parents: 4139
diff changeset
164 if (n > 1)
303b28a7a7e4 [project @ 2002-11-01 02:53:13 by jwe]
jwe
parents: 4139
diff changeset
165 {
7892
7ca2735d74c2 simplify & cleanup octave_value::XXX_vector_value functions
Jaroslav Hajek <highegg@gmail.com>
parents: 7509
diff changeset
166 NDArray m (ArrayN<double> (x, x_dims));
4140
303b28a7a7e4 [project @ 2002-11-01 02:53:13 by jwe]
jwe
parents: 4139
diff changeset
167 octave_value vars (m);
303b28a7a7e4 [project @ 2002-11-01 02:53:13 by jwe]
jwe
parents: 4139
diff changeset
168 args(0) = vars;
303b28a7a7e4 [project @ 2002-11-01 02:53:13 by jwe]
jwe
parents: 4139
diff changeset
169 }
303b28a7a7e4 [project @ 2002-11-01 02:53:13 by jwe]
jwe
parents: 4139
diff changeset
170 else
303b28a7a7e4 [project @ 2002-11-01 02:53:13 by jwe]
jwe
parents: 4139
diff changeset
171 {
4628
c0121a3b9cbe [project @ 2003-11-17 20:19:07 by jwe]
jwe
parents: 4197
diff changeset
172 double d = x(0);
4140
303b28a7a7e4 [project @ 2002-11-01 02:53:13 by jwe]
jwe
parents: 4139
diff changeset
173 octave_value vars (d);
303b28a7a7e4 [project @ 2002-11-01 02:53:13 by jwe]
jwe
parents: 4139
diff changeset
174 args(0) = vars;
303b28a7a7e4 [project @ 2002-11-01 02:53:13 by jwe]
jwe
parents: 4139
diff changeset
175 }
303b28a7a7e4 [project @ 2002-11-01 02:53:13 by jwe]
jwe
parents: 4139
diff changeset
176
303b28a7a7e4 [project @ 2002-11-01 02:53:13 by jwe]
jwe
parents: 4139
diff changeset
177 if (fsolve_fcn)
303b28a7a7e4 [project @ 2002-11-01 02:53:13 by jwe]
jwe
parents: 4139
diff changeset
178 {
303b28a7a7e4 [project @ 2002-11-01 02:53:13 by jwe]
jwe
parents: 4139
diff changeset
179 octave_value_list tmp = fsolve_jac->do_multi_index_op (1, args);
303b28a7a7e4 [project @ 2002-11-01 02:53:13 by jwe]
jwe
parents: 4139
diff changeset
180
303b28a7a7e4 [project @ 2002-11-01 02:53:13 by jwe]
jwe
parents: 4139
diff changeset
181 if (tmp.length () > 0 && tmp(0).is_defined ())
303b28a7a7e4 [project @ 2002-11-01 02:53:13 by jwe]
jwe
parents: 4139
diff changeset
182 {
303b28a7a7e4 [project @ 2002-11-01 02:53:13 by jwe]
jwe
parents: 4139
diff changeset
183 if (! warned_fcn_imaginary && tmp(0).is_complex_type ())
303b28a7a7e4 [project @ 2002-11-01 02:53:13 by jwe]
jwe
parents: 4139
diff changeset
184 {
303b28a7a7e4 [project @ 2002-11-01 02:53:13 by jwe]
jwe
parents: 4139
diff changeset
185 warning ("fsolve: ignoring imaginary part returned from user-supplied jacobian function");
303b28a7a7e4 [project @ 2002-11-01 02:53:13 by jwe]
jwe
parents: 4139
diff changeset
186 warned_fcn_imaginary = true;
303b28a7a7e4 [project @ 2002-11-01 02:53:13 by jwe]
jwe
parents: 4139
diff changeset
187 }
303b28a7a7e4 [project @ 2002-11-01 02:53:13 by jwe]
jwe
parents: 4139
diff changeset
188
303b28a7a7e4 [project @ 2002-11-01 02:53:13 by jwe]
jwe
parents: 4139
diff changeset
189 retval = tmp(0).matrix_value ();
303b28a7a7e4 [project @ 2002-11-01 02:53:13 by jwe]
jwe
parents: 4139
diff changeset
190
303b28a7a7e4 [project @ 2002-11-01 02:53:13 by jwe]
jwe
parents: 4139
diff changeset
191 if (error_state || retval.length () <= 0)
303b28a7a7e4 [project @ 2002-11-01 02:53:13 by jwe]
jwe
parents: 4139
diff changeset
192 gripe_user_supplied_eval ("fsolve");
7509
e41d6aff83ea fsolve: detect nonsquare systems
John W. Eaton <jwe@octave.org>
parents: 7359
diff changeset
193 else if (! (retval.rows () == x.length ()
e41d6aff83ea fsolve: detect nonsquare systems
John W. Eaton <jwe@octave.org>
parents: 7359
diff changeset
194 && retval.columns () == x.length ()))
e41d6aff83ea fsolve: detect nonsquare systems
John W. Eaton <jwe@octave.org>
parents: 7359
diff changeset
195 error ("fsolve: invalid Jacobian matrix dimensions");
4140
303b28a7a7e4 [project @ 2002-11-01 02:53:13 by jwe]
jwe
parents: 4139
diff changeset
196 }
303b28a7a7e4 [project @ 2002-11-01 02:53:13 by jwe]
jwe
parents: 4139
diff changeset
197 else
303b28a7a7e4 [project @ 2002-11-01 02:53:13 by jwe]
jwe
parents: 4139
diff changeset
198 gripe_user_supplied_eval ("fsolve");
303b28a7a7e4 [project @ 2002-11-01 02:53:13 by jwe]
jwe
parents: 4139
diff changeset
199 }
303b28a7a7e4 [project @ 2002-11-01 02:53:13 by jwe]
jwe
parents: 4139
diff changeset
200
303b28a7a7e4 [project @ 2002-11-01 02:53:13 by jwe]
jwe
parents: 4139
diff changeset
201 return retval;
303b28a7a7e4 [project @ 2002-11-01 02:53:13 by jwe]
jwe
parents: 4139
diff changeset
202 }
303b28a7a7e4 [project @ 2002-11-01 02:53:13 by jwe]
jwe
parents: 4139
diff changeset
203
3323
511caaa5e98e [project @ 1999-10-27 02:21:46 by jwe]
jwe
parents: 3321
diff changeset
204 #define FSOLVE_ABORT() \
511caaa5e98e [project @ 1999-10-27 02:21:46 by jwe]
jwe
parents: 3321
diff changeset
205 do \
511caaa5e98e [project @ 1999-10-27 02:21:46 by jwe]
jwe
parents: 3321
diff changeset
206 { \
511caaa5e98e [project @ 1999-10-27 02:21:46 by jwe]
jwe
parents: 3321
diff changeset
207 unwind_protect::run_frame ("Ffsolve"); \
511caaa5e98e [project @ 1999-10-27 02:21:46 by jwe]
jwe
parents: 3321
diff changeset
208 return retval; \
511caaa5e98e [project @ 1999-10-27 02:21:46 by jwe]
jwe
parents: 3321
diff changeset
209 } \
511caaa5e98e [project @ 1999-10-27 02:21:46 by jwe]
jwe
parents: 3321
diff changeset
210 while (0)
511caaa5e98e [project @ 1999-10-27 02:21:46 by jwe]
jwe
parents: 3321
diff changeset
211
511caaa5e98e [project @ 1999-10-27 02:21:46 by jwe]
jwe
parents: 3321
diff changeset
212 #define FSOLVE_ABORT1(msg) \
511caaa5e98e [project @ 1999-10-27 02:21:46 by jwe]
jwe
parents: 3321
diff changeset
213 do \
511caaa5e98e [project @ 1999-10-27 02:21:46 by jwe]
jwe
parents: 3321
diff changeset
214 { \
3747
50f30e40abca [project @ 2000-12-07 05:47:06 by jwe]
jwe
parents: 3568
diff changeset
215 ::error ("fsolve: " msg); \
3323
511caaa5e98e [project @ 1999-10-27 02:21:46 by jwe]
jwe
parents: 3321
diff changeset
216 FSOLVE_ABORT (); \
511caaa5e98e [project @ 1999-10-27 02:21:46 by jwe]
jwe
parents: 3321
diff changeset
217 } \
511caaa5e98e [project @ 1999-10-27 02:21:46 by jwe]
jwe
parents: 3321
diff changeset
218 while (0)
511caaa5e98e [project @ 1999-10-27 02:21:46 by jwe]
jwe
parents: 3321
diff changeset
219
511caaa5e98e [project @ 1999-10-27 02:21:46 by jwe]
jwe
parents: 3321
diff changeset
220 #define FSOLVE_ABORT2(fmt, arg) \
511caaa5e98e [project @ 1999-10-27 02:21:46 by jwe]
jwe
parents: 3321
diff changeset
221 do \
511caaa5e98e [project @ 1999-10-27 02:21:46 by jwe]
jwe
parents: 3321
diff changeset
222 { \
3747
50f30e40abca [project @ 2000-12-07 05:47:06 by jwe]
jwe
parents: 3568
diff changeset
223 ::error ("fsolve: " fmt, arg); \
3323
511caaa5e98e [project @ 1999-10-27 02:21:46 by jwe]
jwe
parents: 3321
diff changeset
224 FSOLVE_ABORT (); \
511caaa5e98e [project @ 1999-10-27 02:21:46 by jwe]
jwe
parents: 3321
diff changeset
225 } \
511caaa5e98e [project @ 1999-10-27 02:21:46 by jwe]
jwe
parents: 3321
diff changeset
226 while (0)
511caaa5e98e [project @ 1999-10-27 02:21:46 by jwe]
jwe
parents: 3321
diff changeset
227
2928
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
228 DEFUN_DLD (fsolve, args, nargout,
3368
a4cd1e9d9962 [project @ 1999-11-20 17:22:48 by jwe]
jwe
parents: 3325
diff changeset
229 "-*- texinfo -*-\n\
7279
72b5e1701da2 [project @ 2007-12-10 21:01:48 by jwe]
jwe
parents: 7017
diff changeset
230 @deftypefn {Loadable Function} {[@var{x}, @var{fval}, @var{info}] =} fsolve (@var{fcn}, @var{x0})\n\
3368
a4cd1e9d9962 [project @ 1999-11-20 17:22:48 by jwe]
jwe
parents: 3325
diff changeset
231 Given @var{fcn}, the name of a function of the form @code{f (@var{x})}\n\
a4cd1e9d9962 [project @ 1999-11-20 17:22:48 by jwe]
jwe
parents: 3325
diff changeset
232 and an initial starting point @var{x0}, @code{fsolve} solves the set of\n\
a4cd1e9d9962 [project @ 1999-11-20 17:22:48 by jwe]
jwe
parents: 3325
diff changeset
233 equations such that @code{f(@var{x}) == 0}.\n\
3964
3030cb6cb559 [project @ 2002-06-28 17:17:55 by jwe]
jwe
parents: 3747
diff changeset
234 \n\
7359
8fb8d6985395 [project @ 2008-01-11 02:40:46 by jwe]
jwe
parents: 7279
diff changeset
235 On return, @var{fval} contains the value of the function @var{fcn}\n\
8fb8d6985395 [project @ 2008-01-11 02:40:46 by jwe]
jwe
parents: 7279
diff changeset
236 evaluated at @var{x}, and @var{info} may be one of the following values:\n\
8fb8d6985395 [project @ 2008-01-11 02:40:46 by jwe]
jwe
parents: 7279
diff changeset
237 \n\
8fb8d6985395 [project @ 2008-01-11 02:40:46 by jwe]
jwe
parents: 7279
diff changeset
238 @table @asis\n\
8fb8d6985395 [project @ 2008-01-11 02:40:46 by jwe]
jwe
parents: 7279
diff changeset
239 \n\
8fb8d6985395 [project @ 2008-01-11 02:40:46 by jwe]
jwe
parents: 7279
diff changeset
240 @item -2\n\
8fb8d6985395 [project @ 2008-01-11 02:40:46 by jwe]
jwe
parents: 7279
diff changeset
241 Invalid input parameters.\n\
8fb8d6985395 [project @ 2008-01-11 02:40:46 by jwe]
jwe
parents: 7279
diff changeset
242 @item -1\n\
8fb8d6985395 [project @ 2008-01-11 02:40:46 by jwe]
jwe
parents: 7279
diff changeset
243 Error in user-supplied function.\n\
8fb8d6985395 [project @ 2008-01-11 02:40:46 by jwe]
jwe
parents: 7279
diff changeset
244 @item 1\n\
8fb8d6985395 [project @ 2008-01-11 02:40:46 by jwe]
jwe
parents: 7279
diff changeset
245 Relative error between two consecutive iterates is at most the\n\
8fb8d6985395 [project @ 2008-01-11 02:40:46 by jwe]
jwe
parents: 7279
diff changeset
246 specified tolerance (see @code{fsolve_options}).\n\
8fb8d6985395 [project @ 2008-01-11 02:40:46 by jwe]
jwe
parents: 7279
diff changeset
247 @item 3\n\
8fb8d6985395 [project @ 2008-01-11 02:40:46 by jwe]
jwe
parents: 7279
diff changeset
248 Algorithm failed to converge.\n\
8fb8d6985395 [project @ 2008-01-11 02:40:46 by jwe]
jwe
parents: 7279
diff changeset
249 @item 4\n\
8fb8d6985395 [project @ 2008-01-11 02:40:46 by jwe]
jwe
parents: 7279
diff changeset
250 Limit on number of function calls reached.\n\
8fb8d6985395 [project @ 2008-01-11 02:40:46 by jwe]
jwe
parents: 7279
diff changeset
251 @end table\n\
8fb8d6985395 [project @ 2008-01-11 02:40:46 by jwe]
jwe
parents: 7279
diff changeset
252 \n\
5729
e065f7c18bdc [project @ 2006-04-03 19:03:30 by jwe]
jwe
parents: 5307
diff changeset
253 If @var{fcn} is a two-element string array, or a two element cell array\n\
e065f7c18bdc [project @ 2006-04-03 19:03:30 by jwe]
jwe
parents: 5307
diff changeset
254 containing either the function name or inline or function handle. The\n\
e065f7c18bdc [project @ 2006-04-03 19:03:30 by jwe]
jwe
parents: 5307
diff changeset
255 first element names the function @math{f} described above, and the second\n\
e065f7c18bdc [project @ 2006-04-03 19:03:30 by jwe]
jwe
parents: 5307
diff changeset
256 element names a function of the form @code{j (@var{x})} to compute the\n\
e065f7c18bdc [project @ 2006-04-03 19:03:30 by jwe]
jwe
parents: 5307
diff changeset
257 Jacobian matrix with elements\n\
4144
b02ada83de67 [project @ 2002-11-01 18:03:56 by jwe]
jwe
parents: 4140
diff changeset
258 @tex\n\
b02ada83de67 [project @ 2002-11-01 18:03:56 by jwe]
jwe
parents: 4140
diff changeset
259 $$ J = {\\partial f_i \\over \\partial x_j} $$\n\
b02ada83de67 [project @ 2002-11-01 18:03:56 by jwe]
jwe
parents: 4140
diff changeset
260 @end tex\n\
b02ada83de67 [project @ 2002-11-01 18:03:56 by jwe]
jwe
parents: 4140
diff changeset
261 @ifinfo\n\
b02ada83de67 [project @ 2002-11-01 18:03:56 by jwe]
jwe
parents: 4140
diff changeset
262 \n\
b02ada83de67 [project @ 2002-11-01 18:03:56 by jwe]
jwe
parents: 4140
diff changeset
263 @example\n\
4197
40f76ce7a051 [project @ 2002-11-21 18:56:25 by jwe]
jwe
parents: 4144
diff changeset
264 df_i\n\
40f76ce7a051 [project @ 2002-11-21 18:56:25 by jwe]
jwe
parents: 4144
diff changeset
265 jac(i,j) = ----\n\
40f76ce7a051 [project @ 2002-11-21 18:56:25 by jwe]
jwe
parents: 4144
diff changeset
266 dx_j\n\
4144
b02ada83de67 [project @ 2002-11-01 18:03:56 by jwe]
jwe
parents: 4140
diff changeset
267 @end example\n\
b02ada83de67 [project @ 2002-11-01 18:03:56 by jwe]
jwe
parents: 4140
diff changeset
268 @end ifinfo\n\
b02ada83de67 [project @ 2002-11-01 18:03:56 by jwe]
jwe
parents: 4140
diff changeset
269 \n\
3964
3030cb6cb559 [project @ 2002-06-28 17:17:55 by jwe]
jwe
parents: 3747
diff changeset
270 You can use the function @code{fsolve_options} to set optional\n\
3030cb6cb559 [project @ 2002-06-28 17:17:55 by jwe]
jwe
parents: 3747
diff changeset
271 parameters for @code{fsolve}.\n\
3368
a4cd1e9d9962 [project @ 1999-11-20 17:22:48 by jwe]
jwe
parents: 3325
diff changeset
272 @end deftypefn")
2928
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
273 {
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
274 octave_value_list retval;
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
275
4140
303b28a7a7e4 [project @ 2002-11-01 02:53:13 by jwe]
jwe
parents: 4139
diff changeset
276 warned_fcn_imaginary = false;
303b28a7a7e4 [project @ 2002-11-01 02:53:13 by jwe]
jwe
parents: 4139
diff changeset
277 warned_jac_imaginary = false;
4139
02ca908056e9 [project @ 2002-11-01 00:49:13 by jwe]
jwe
parents: 4132
diff changeset
278
3243
dd00769643ae [project @ 1999-05-28 04:19:00 by jwe]
jwe
parents: 3148
diff changeset
279 unwind_protect::begin_frame ("Ffsolve");
2928
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
280
3243
dd00769643ae [project @ 1999-05-28 04:19:00 by jwe]
jwe
parents: 3148
diff changeset
281 unwind_protect_int (call_depth);
dd00769643ae [project @ 1999-05-28 04:19:00 by jwe]
jwe
parents: 3148
diff changeset
282 call_depth++;
dd00769643ae [project @ 1999-05-28 04:19:00 by jwe]
jwe
parents: 3148
diff changeset
283
dd00769643ae [project @ 1999-05-28 04:19:00 by jwe]
jwe
parents: 3148
diff changeset
284 if (call_depth > 1)
3323
511caaa5e98e [project @ 1999-10-27 02:21:46 by jwe]
jwe
parents: 3321
diff changeset
285 FSOLVE_ABORT1 ("invalid recursive call");
2928
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
286
3243
dd00769643ae [project @ 1999-05-28 04:19:00 by jwe]
jwe
parents: 3148
diff changeset
287 int nargin = args.length ();
2928
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
288
3243
dd00769643ae [project @ 1999-05-28 04:19:00 by jwe]
jwe
parents: 3148
diff changeset
289 if (nargin == 2 && nargout < 4)
dd00769643ae [project @ 1999-05-28 04:19:00 by jwe]
jwe
parents: 3148
diff changeset
290 {
5729
e065f7c18bdc [project @ 2006-04-03 19:03:30 by jwe]
jwe
parents: 5307
diff changeset
291 std::string fcn_name, fname, jac_name, jname;
4140
303b28a7a7e4 [project @ 2002-11-01 02:53:13 by jwe]
jwe
parents: 4139
diff changeset
292 fsolve_fcn = 0;
303b28a7a7e4 [project @ 2002-11-01 02:53:13 by jwe]
jwe
parents: 4139
diff changeset
293 fsolve_jac = 0;
303b28a7a7e4 [project @ 2002-11-01 02:53:13 by jwe]
jwe
parents: 4139
diff changeset
294
303b28a7a7e4 [project @ 2002-11-01 02:53:13 by jwe]
jwe
parents: 4139
diff changeset
295 octave_value f_arg = args(0);
303b28a7a7e4 [project @ 2002-11-01 02:53:13 by jwe]
jwe
parents: 4139
diff changeset
296
5729
e065f7c18bdc [project @ 2006-04-03 19:03:30 by jwe]
jwe
parents: 5307
diff changeset
297 if (f_arg.is_cell ())
e065f7c18bdc [project @ 2006-04-03 19:03:30 by jwe]
jwe
parents: 5307
diff changeset
298 {
e065f7c18bdc [project @ 2006-04-03 19:03:30 by jwe]
jwe
parents: 5307
diff changeset
299 Cell c = f_arg.cell_value ();
e065f7c18bdc [project @ 2006-04-03 19:03:30 by jwe]
jwe
parents: 5307
diff changeset
300 if (c.length() == 1)
e065f7c18bdc [project @ 2006-04-03 19:03:30 by jwe]
jwe
parents: 5307
diff changeset
301 f_arg = c(0);
e065f7c18bdc [project @ 2006-04-03 19:03:30 by jwe]
jwe
parents: 5307
diff changeset
302 else if (c.length() == 2)
e065f7c18bdc [project @ 2006-04-03 19:03:30 by jwe]
jwe
parents: 5307
diff changeset
303 {
e065f7c18bdc [project @ 2006-04-03 19:03:30 by jwe]
jwe
parents: 5307
diff changeset
304 if (c(0).is_function_handle () || c(0).is_inline_function ())
e065f7c18bdc [project @ 2006-04-03 19:03:30 by jwe]
jwe
parents: 5307
diff changeset
305 fsolve_fcn = c(0).function_value ();
e065f7c18bdc [project @ 2006-04-03 19:03:30 by jwe]
jwe
parents: 5307
diff changeset
306 else
e065f7c18bdc [project @ 2006-04-03 19:03:30 by jwe]
jwe
parents: 5307
diff changeset
307 {
e065f7c18bdc [project @ 2006-04-03 19:03:30 by jwe]
jwe
parents: 5307
diff changeset
308 fcn_name = unique_symbol_name ("__fsolve_fcn__");
e065f7c18bdc [project @ 2006-04-03 19:03:30 by jwe]
jwe
parents: 5307
diff changeset
309 fname = "function y = ";
e065f7c18bdc [project @ 2006-04-03 19:03:30 by jwe]
jwe
parents: 5307
diff changeset
310 fname.append (fcn_name);
e065f7c18bdc [project @ 2006-04-03 19:03:30 by jwe]
jwe
parents: 5307
diff changeset
311 fname.append (" (x) y = ");
e065f7c18bdc [project @ 2006-04-03 19:03:30 by jwe]
jwe
parents: 5307
diff changeset
312 fsolve_fcn = extract_function
e065f7c18bdc [project @ 2006-04-03 19:03:30 by jwe]
jwe
parents: 5307
diff changeset
313 (c(0), "fsolve", fcn_name, fname, "; endfunction");
e065f7c18bdc [project @ 2006-04-03 19:03:30 by jwe]
jwe
parents: 5307
diff changeset
314 }
e065f7c18bdc [project @ 2006-04-03 19:03:30 by jwe]
jwe
parents: 5307
diff changeset
315
e065f7c18bdc [project @ 2006-04-03 19:03:30 by jwe]
jwe
parents: 5307
diff changeset
316 if (fsolve_fcn)
e065f7c18bdc [project @ 2006-04-03 19:03:30 by jwe]
jwe
parents: 5307
diff changeset
317 {
e065f7c18bdc [project @ 2006-04-03 19:03:30 by jwe]
jwe
parents: 5307
diff changeset
318 if (c(1).is_function_handle () || c(1).is_inline_function ())
e065f7c18bdc [project @ 2006-04-03 19:03:30 by jwe]
jwe
parents: 5307
diff changeset
319 fsolve_jac = c(1).function_value ();
e065f7c18bdc [project @ 2006-04-03 19:03:30 by jwe]
jwe
parents: 5307
diff changeset
320 else
e065f7c18bdc [project @ 2006-04-03 19:03:30 by jwe]
jwe
parents: 5307
diff changeset
321 {
e065f7c18bdc [project @ 2006-04-03 19:03:30 by jwe]
jwe
parents: 5307
diff changeset
322 jac_name = unique_symbol_name ("__fsolve_jac__");
e065f7c18bdc [project @ 2006-04-03 19:03:30 by jwe]
jwe
parents: 5307
diff changeset
323 jname = "function y = ";
e065f7c18bdc [project @ 2006-04-03 19:03:30 by jwe]
jwe
parents: 5307
diff changeset
324 jname.append (jac_name);
e065f7c18bdc [project @ 2006-04-03 19:03:30 by jwe]
jwe
parents: 5307
diff changeset
325 jname.append (" (x) jac = ");
e065f7c18bdc [project @ 2006-04-03 19:03:30 by jwe]
jwe
parents: 5307
diff changeset
326 fsolve_jac = extract_function
e065f7c18bdc [project @ 2006-04-03 19:03:30 by jwe]
jwe
parents: 5307
diff changeset
327 (c(1), "fsolve", jac_name, jname, "; endfunction");
4140
303b28a7a7e4 [project @ 2002-11-01 02:53:13 by jwe]
jwe
parents: 4139
diff changeset
328
5729
e065f7c18bdc [project @ 2006-04-03 19:03:30 by jwe]
jwe
parents: 5307
diff changeset
329 if (!fsolve_jac)
e065f7c18bdc [project @ 2006-04-03 19:03:30 by jwe]
jwe
parents: 5307
diff changeset
330 {
e065f7c18bdc [project @ 2006-04-03 19:03:30 by jwe]
jwe
parents: 5307
diff changeset
331 if (fcn_name.length())
e065f7c18bdc [project @ 2006-04-03 19:03:30 by jwe]
jwe
parents: 5307
diff changeset
332 clear_function (fcn_name);
e065f7c18bdc [project @ 2006-04-03 19:03:30 by jwe]
jwe
parents: 5307
diff changeset
333 fsolve_fcn = 0;
e065f7c18bdc [project @ 2006-04-03 19:03:30 by jwe]
jwe
parents: 5307
diff changeset
334 }
e065f7c18bdc [project @ 2006-04-03 19:03:30 by jwe]
jwe
parents: 5307
diff changeset
335 }
e065f7c18bdc [project @ 2006-04-03 19:03:30 by jwe]
jwe
parents: 5307
diff changeset
336 }
e065f7c18bdc [project @ 2006-04-03 19:03:30 by jwe]
jwe
parents: 5307
diff changeset
337 }
e065f7c18bdc [project @ 2006-04-03 19:03:30 by jwe]
jwe
parents: 5307
diff changeset
338 else
e065f7c18bdc [project @ 2006-04-03 19:03:30 by jwe]
jwe
parents: 5307
diff changeset
339 FSOLVE_ABORT1 ("incorrect number of elements in cell array");
e065f7c18bdc [project @ 2006-04-03 19:03:30 by jwe]
jwe
parents: 5307
diff changeset
340 }
4140
303b28a7a7e4 [project @ 2002-11-01 02:53:13 by jwe]
jwe
parents: 4139
diff changeset
341
5729
e065f7c18bdc [project @ 2006-04-03 19:03:30 by jwe]
jwe
parents: 5307
diff changeset
342 if (!fsolve_fcn && ! f_arg.is_cell())
e065f7c18bdc [project @ 2006-04-03 19:03:30 by jwe]
jwe
parents: 5307
diff changeset
343 {
e065f7c18bdc [project @ 2006-04-03 19:03:30 by jwe]
jwe
parents: 5307
diff changeset
344 if (f_arg.is_function_handle () || f_arg.is_inline_function ())
e065f7c18bdc [project @ 2006-04-03 19:03:30 by jwe]
jwe
parents: 5307
diff changeset
345 fsolve_fcn = f_arg.function_value ();
e065f7c18bdc [project @ 2006-04-03 19:03:30 by jwe]
jwe
parents: 5307
diff changeset
346 else
e065f7c18bdc [project @ 2006-04-03 19:03:30 by jwe]
jwe
parents: 5307
diff changeset
347 {
e065f7c18bdc [project @ 2006-04-03 19:03:30 by jwe]
jwe
parents: 5307
diff changeset
348 switch (f_arg.rows ())
e065f7c18bdc [project @ 2006-04-03 19:03:30 by jwe]
jwe
parents: 5307
diff changeset
349 {
e065f7c18bdc [project @ 2006-04-03 19:03:30 by jwe]
jwe
parents: 5307
diff changeset
350 case 1:
e065f7c18bdc [project @ 2006-04-03 19:03:30 by jwe]
jwe
parents: 5307
diff changeset
351 do
e065f7c18bdc [project @ 2006-04-03 19:03:30 by jwe]
jwe
parents: 5307
diff changeset
352 {
e065f7c18bdc [project @ 2006-04-03 19:03:30 by jwe]
jwe
parents: 5307
diff changeset
353 fcn_name = unique_symbol_name ("__fsolve_fcn__");
e065f7c18bdc [project @ 2006-04-03 19:03:30 by jwe]
jwe
parents: 5307
diff changeset
354 fname = "function y = ";
e065f7c18bdc [project @ 2006-04-03 19:03:30 by jwe]
jwe
parents: 5307
diff changeset
355 fname.append (fcn_name);
e065f7c18bdc [project @ 2006-04-03 19:03:30 by jwe]
jwe
parents: 5307
diff changeset
356 fname.append (" (x) y = ");
e065f7c18bdc [project @ 2006-04-03 19:03:30 by jwe]
jwe
parents: 5307
diff changeset
357 fsolve_fcn = extract_function
e065f7c18bdc [project @ 2006-04-03 19:03:30 by jwe]
jwe
parents: 5307
diff changeset
358 (f_arg, "fsolve", fcn_name, fname, "; endfunction");
e065f7c18bdc [project @ 2006-04-03 19:03:30 by jwe]
jwe
parents: 5307
diff changeset
359 }
e065f7c18bdc [project @ 2006-04-03 19:03:30 by jwe]
jwe
parents: 5307
diff changeset
360 while (0);
e065f7c18bdc [project @ 2006-04-03 19:03:30 by jwe]
jwe
parents: 5307
diff changeset
361 break;
4140
303b28a7a7e4 [project @ 2002-11-01 02:53:13 by jwe]
jwe
parents: 4139
diff changeset
362
5729
e065f7c18bdc [project @ 2006-04-03 19:03:30 by jwe]
jwe
parents: 5307
diff changeset
363 case 2:
4140
303b28a7a7e4 [project @ 2002-11-01 02:53:13 by jwe]
jwe
parents: 4139
diff changeset
364 {
5729
e065f7c18bdc [project @ 2006-04-03 19:03:30 by jwe]
jwe
parents: 5307
diff changeset
365 string_vector tmp = f_arg.all_strings ();
e065f7c18bdc [project @ 2006-04-03 19:03:30 by jwe]
jwe
parents: 5307
diff changeset
366
e065f7c18bdc [project @ 2006-04-03 19:03:30 by jwe]
jwe
parents: 5307
diff changeset
367 if (! error_state)
e065f7c18bdc [project @ 2006-04-03 19:03:30 by jwe]
jwe
parents: 5307
diff changeset
368 {
e065f7c18bdc [project @ 2006-04-03 19:03:30 by jwe]
jwe
parents: 5307
diff changeset
369 fcn_name = unique_symbol_name ("__fsolve_fcn__");
e065f7c18bdc [project @ 2006-04-03 19:03:30 by jwe]
jwe
parents: 5307
diff changeset
370 fname = "function y = ";
e065f7c18bdc [project @ 2006-04-03 19:03:30 by jwe]
jwe
parents: 5307
diff changeset
371 fname.append (fcn_name);
e065f7c18bdc [project @ 2006-04-03 19:03:30 by jwe]
jwe
parents: 5307
diff changeset
372 fname.append (" (x) y = ");
e065f7c18bdc [project @ 2006-04-03 19:03:30 by jwe]
jwe
parents: 5307
diff changeset
373 fsolve_fcn = extract_function
e065f7c18bdc [project @ 2006-04-03 19:03:30 by jwe]
jwe
parents: 5307
diff changeset
374 (tmp(0), "fsolve", fcn_name, fname, "; endfunction");
4140
303b28a7a7e4 [project @ 2002-11-01 02:53:13 by jwe]
jwe
parents: 4139
diff changeset
375
5729
e065f7c18bdc [project @ 2006-04-03 19:03:30 by jwe]
jwe
parents: 5307
diff changeset
376 if (fsolve_fcn)
e065f7c18bdc [project @ 2006-04-03 19:03:30 by jwe]
jwe
parents: 5307
diff changeset
377 {
e065f7c18bdc [project @ 2006-04-03 19:03:30 by jwe]
jwe
parents: 5307
diff changeset
378 jac_name = unique_symbol_name ("__fsolve_jac__");
e065f7c18bdc [project @ 2006-04-03 19:03:30 by jwe]
jwe
parents: 5307
diff changeset
379 jname = "function y = ";
e065f7c18bdc [project @ 2006-04-03 19:03:30 by jwe]
jwe
parents: 5307
diff changeset
380 jname.append (jac_name);
e065f7c18bdc [project @ 2006-04-03 19:03:30 by jwe]
jwe
parents: 5307
diff changeset
381 jname.append (" (x) jac = ");
e065f7c18bdc [project @ 2006-04-03 19:03:30 by jwe]
jwe
parents: 5307
diff changeset
382 fsolve_jac = extract_function
e065f7c18bdc [project @ 2006-04-03 19:03:30 by jwe]
jwe
parents: 5307
diff changeset
383 (tmp(1), "fsolve", jac_name, jname,
e065f7c18bdc [project @ 2006-04-03 19:03:30 by jwe]
jwe
parents: 5307
diff changeset
384 "; endfunction");
e065f7c18bdc [project @ 2006-04-03 19:03:30 by jwe]
jwe
parents: 5307
diff changeset
385
e065f7c18bdc [project @ 2006-04-03 19:03:30 by jwe]
jwe
parents: 5307
diff changeset
386 if (!fsolve_jac)
e065f7c18bdc [project @ 2006-04-03 19:03:30 by jwe]
jwe
parents: 5307
diff changeset
387 {
e065f7c18bdc [project @ 2006-04-03 19:03:30 by jwe]
jwe
parents: 5307
diff changeset
388 if (fcn_name.length())
e065f7c18bdc [project @ 2006-04-03 19:03:30 by jwe]
jwe
parents: 5307
diff changeset
389 clear_function (fcn_name);
e065f7c18bdc [project @ 2006-04-03 19:03:30 by jwe]
jwe
parents: 5307
diff changeset
390 fsolve_fcn = 0;
e065f7c18bdc [project @ 2006-04-03 19:03:30 by jwe]
jwe
parents: 5307
diff changeset
391 }
e065f7c18bdc [project @ 2006-04-03 19:03:30 by jwe]
jwe
parents: 5307
diff changeset
392 }
e065f7c18bdc [project @ 2006-04-03 19:03:30 by jwe]
jwe
parents: 5307
diff changeset
393 }
4140
303b28a7a7e4 [project @ 2002-11-01 02:53:13 by jwe]
jwe
parents: 4139
diff changeset
394 }
5729
e065f7c18bdc [project @ 2006-04-03 19:03:30 by jwe]
jwe
parents: 5307
diff changeset
395 }
e065f7c18bdc [project @ 2006-04-03 19:03:30 by jwe]
jwe
parents: 5307
diff changeset
396 }
4140
303b28a7a7e4 [project @ 2002-11-01 02:53:13 by jwe]
jwe
parents: 4139
diff changeset
397 }
303b28a7a7e4 [project @ 2002-11-01 02:53:13 by jwe]
jwe
parents: 4139
diff changeset
398
303b28a7a7e4 [project @ 2002-11-01 02:53:13 by jwe]
jwe
parents: 4139
diff changeset
399 if (error_state || ! fsolve_fcn)
3323
511caaa5e98e [project @ 1999-10-27 02:21:46 by jwe]
jwe
parents: 3321
diff changeset
400 FSOLVE_ABORT ();
2928
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
401
7892
7ca2735d74c2 simplify & cleanup octave_value::XXX_vector_value functions
Jaroslav Hajek <highegg@gmail.com>
parents: 7509
diff changeset
402 NDArray xa = args(1).array_value ();
7ca2735d74c2 simplify & cleanup octave_value::XXX_vector_value functions
Jaroslav Hajek <highegg@gmail.com>
parents: 7509
diff changeset
403 x_dims = xa.dims ();
7ca2735d74c2 simplify & cleanup octave_value::XXX_vector_value functions
Jaroslav Hajek <highegg@gmail.com>
parents: 7509
diff changeset
404 ColumnVector x (xa);
2928
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
405
3243
dd00769643ae [project @ 1999-05-28 04:19:00 by jwe]
jwe
parents: 3148
diff changeset
406 if (error_state)
3323
511caaa5e98e [project @ 1999-10-27 02:21:46 by jwe]
jwe
parents: 3321
diff changeset
407 FSOLVE_ABORT1 ("expecting vector as second argument");
3243
dd00769643ae [project @ 1999-05-28 04:19:00 by jwe]
jwe
parents: 3148
diff changeset
408
4132
87eb044020ae [project @ 2002-10-29 21:21:45 by jwe]
jwe
parents: 4122
diff changeset
409 if (nargin > 3)
3243
dd00769643ae [project @ 1999-05-28 04:19:00 by jwe]
jwe
parents: 3148
diff changeset
410 warning ("fsolve: ignoring extra arguments");
2928
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
411
4132
87eb044020ae [project @ 2002-10-29 21:21:45 by jwe]
jwe
parents: 4122
diff changeset
412 if (nargout > 3)
3243
dd00769643ae [project @ 1999-05-28 04:19:00 by jwe]
jwe
parents: 3148
diff changeset
413 warning ("fsolve: can't compute path output yet");
2928
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
414
3971
41e7fa40ff4c [project @ 2002-07-02 23:46:48 by jwe]
jwe
parents: 3964
diff changeset
415 NLFunc nleqn_fcn (fsolve_user_function);
4140
303b28a7a7e4 [project @ 2002-11-01 02:53:13 by jwe]
jwe
parents: 4139
diff changeset
416 if (fsolve_jac)
303b28a7a7e4 [project @ 2002-11-01 02:53:13 by jwe]
jwe
parents: 4139
diff changeset
417 nleqn_fcn.set_jacobian_function (fsolve_user_jacobian);
303b28a7a7e4 [project @ 2002-11-01 02:53:13 by jwe]
jwe
parents: 4139
diff changeset
418
3971
41e7fa40ff4c [project @ 2002-07-02 23:46:48 by jwe]
jwe
parents: 3964
diff changeset
419 NLEqn nleqn (x, nleqn_fcn);
4122
19a1626b8d57 [project @ 2002-10-23 22:10:53 by jwe]
jwe
parents: 3998
diff changeset
420 nleqn.set_options (fsolve_opts);
3243
dd00769643ae [project @ 1999-05-28 04:19:00 by jwe]
jwe
parents: 3148
diff changeset
421
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 4628
diff changeset
422 octave_idx_type info;
3971
41e7fa40ff4c [project @ 2002-07-02 23:46:48 by jwe]
jwe
parents: 3964
diff changeset
423 ColumnVector soln = nleqn.solve (info);
2928
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
424
5729
e065f7c18bdc [project @ 2006-04-03 19:03:30 by jwe]
jwe
parents: 5307
diff changeset
425 if (fcn_name.length())
e065f7c18bdc [project @ 2006-04-03 19:03:30 by jwe]
jwe
parents: 5307
diff changeset
426 clear_function (fcn_name);
e065f7c18bdc [project @ 2006-04-03 19:03:30 by jwe]
jwe
parents: 5307
diff changeset
427 if (jac_name.length())
e065f7c18bdc [project @ 2006-04-03 19:03:30 by jwe]
jwe
parents: 5307
diff changeset
428 clear_function (jac_name);
e065f7c18bdc [project @ 2006-04-03 19:03:30 by jwe]
jwe
parents: 5307
diff changeset
429
3971
41e7fa40ff4c [project @ 2002-07-02 23:46:48 by jwe]
jwe
parents: 3964
diff changeset
430 if (! error_state)
41e7fa40ff4c [project @ 2002-07-02 23:46:48 by jwe]
jwe
parents: 3964
diff changeset
431 {
7279
72b5e1701da2 [project @ 2007-12-10 21:01:48 by jwe]
jwe
parents: 7017
diff changeset
432 retval(2) = static_cast<double> (hybrd_info_to_fsolve_info (info));
72b5e1701da2 [project @ 2007-12-10 21:01:48 by jwe]
jwe
parents: 7017
diff changeset
433 retval(1) = nleqn.function_value ();
7892
7ca2735d74c2 simplify & cleanup octave_value::XXX_vector_value functions
Jaroslav Hajek <highegg@gmail.com>
parents: 7509
diff changeset
434 retval(0) = NDArray (ArrayN<double> (soln.reshape (x_dims)));
2928
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
435
4132
87eb044020ae [project @ 2002-10-29 21:21:45 by jwe]
jwe
parents: 4122
diff changeset
436 if (! nleqn.solution_ok () && nargout < 2)
7279
72b5e1701da2 [project @ 2007-12-10 21:01:48 by jwe]
jwe
parents: 7017
diff changeset
437 {
72b5e1701da2 [project @ 2007-12-10 21:01:48 by jwe]
jwe
parents: 7017
diff changeset
438 std::string msg = nleqn.error_message ();
72b5e1701da2 [project @ 2007-12-10 21:01:48 by jwe]
jwe
parents: 7017
diff changeset
439 error ("fsolve: %s", msg.c_str ());
72b5e1701da2 [project @ 2007-12-10 21:01:48 by jwe]
jwe
parents: 7017
diff changeset
440 }
3971
41e7fa40ff4c [project @ 2002-07-02 23:46:48 by jwe]
jwe
parents: 3964
diff changeset
441 }
3243
dd00769643ae [project @ 1999-05-28 04:19:00 by jwe]
jwe
parents: 3148
diff changeset
442 }
dd00769643ae [project @ 1999-05-28 04:19:00 by jwe]
jwe
parents: 3148
diff changeset
443 else
5823
080c08b192d8 [project @ 2006-05-19 05:32:17 by jwe]
jwe
parents: 5729
diff changeset
444 print_usage ();
2928
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
445
3243
dd00769643ae [project @ 1999-05-28 04:19:00 by jwe]
jwe
parents: 3148
diff changeset
446 unwind_protect::run_frame ("Ffsolve");
2928
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
447
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
448 return retval;
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
449 }
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
450
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
451 /*
7279
72b5e1701da2 [project @ 2007-12-10 21:01:48 by jwe]
jwe
parents: 7017
diff changeset
452 %!function retval = f (p)
72b5e1701da2 [project @ 2007-12-10 21:01:48 by jwe]
jwe
parents: 7017
diff changeset
453 %! x = p(1);
72b5e1701da2 [project @ 2007-12-10 21:01:48 by jwe]
jwe
parents: 7017
diff changeset
454 %! y = p(2);
72b5e1701da2 [project @ 2007-12-10 21:01:48 by jwe]
jwe
parents: 7017
diff changeset
455 %! z = p(3);
72b5e1701da2 [project @ 2007-12-10 21:01:48 by jwe]
jwe
parents: 7017
diff changeset
456 %! retval = zeros (3, 1);
72b5e1701da2 [project @ 2007-12-10 21:01:48 by jwe]
jwe
parents: 7017
diff changeset
457 %! retval(1) = sin(x) + y**2 + log(z) - 7;
72b5e1701da2 [project @ 2007-12-10 21:01:48 by jwe]
jwe
parents: 7017
diff changeset
458 %! retval(2) = 3*x + 2**y -z**3 + 1;
72b5e1701da2 [project @ 2007-12-10 21:01:48 by jwe]
jwe
parents: 7017
diff changeset
459 %! retval(3) = x + y + z - 5;
72b5e1701da2 [project @ 2007-12-10 21:01:48 by jwe]
jwe
parents: 7017
diff changeset
460 %!test
72b5e1701da2 [project @ 2007-12-10 21:01:48 by jwe]
jwe
parents: 7017
diff changeset
461 %! x_opt = [ 0.599054;
72b5e1701da2 [project @ 2007-12-10 21:01:48 by jwe]
jwe
parents: 7017
diff changeset
462 %! 2.395931;
72b5e1701da2 [project @ 2007-12-10 21:01:48 by jwe]
jwe
parents: 7017
diff changeset
463 %! 2.005014 ];
72b5e1701da2 [project @ 2007-12-10 21:01:48 by jwe]
jwe
parents: 7017
diff changeset
464 %! tol = 1.0e-5;
7892
7ca2735d74c2 simplify & cleanup octave_value::XXX_vector_value functions
Jaroslav Hajek <highegg@gmail.com>
parents: 7509
diff changeset
465 %! [x, fval, info] = fsolve ("f", [ 0.5; 2.0; 2.5 ]);
7279
72b5e1701da2 [project @ 2007-12-10 21:01:48 by jwe]
jwe
parents: 7017
diff changeset
466 %! info_bad = (info != 1);
72b5e1701da2 [project @ 2007-12-10 21:01:48 by jwe]
jwe
parents: 7017
diff changeset
467 %! solution_bad = sum (abs (x - x_opt) > tol);
72b5e1701da2 [project @ 2007-12-10 21:01:48 by jwe]
jwe
parents: 7017
diff changeset
468 %! value_bad = sum (abs (fval) > tol);
72b5e1701da2 [project @ 2007-12-10 21:01:48 by jwe]
jwe
parents: 7017
diff changeset
469 %! if (info_bad)
72b5e1701da2 [project @ 2007-12-10 21:01:48 by jwe]
jwe
parents: 7017
diff changeset
470 %! printf_assert ("info bad\n");
72b5e1701da2 [project @ 2007-12-10 21:01:48 by jwe]
jwe
parents: 7017
diff changeset
471 %! else
72b5e1701da2 [project @ 2007-12-10 21:01:48 by jwe]
jwe
parents: 7017
diff changeset
472 %! printf_assert ("info good\n");
72b5e1701da2 [project @ 2007-12-10 21:01:48 by jwe]
jwe
parents: 7017
diff changeset
473 %! endif
72b5e1701da2 [project @ 2007-12-10 21:01:48 by jwe]
jwe
parents: 7017
diff changeset
474 %! if (solution_bad)
72b5e1701da2 [project @ 2007-12-10 21:01:48 by jwe]
jwe
parents: 7017
diff changeset
475 %! printf_assert ("solution bad\n");
72b5e1701da2 [project @ 2007-12-10 21:01:48 by jwe]
jwe
parents: 7017
diff changeset
476 %! else
72b5e1701da2 [project @ 2007-12-10 21:01:48 by jwe]
jwe
parents: 7017
diff changeset
477 %! printf_assert ("solution good\n");
72b5e1701da2 [project @ 2007-12-10 21:01:48 by jwe]
jwe
parents: 7017
diff changeset
478 %! endif
72b5e1701da2 [project @ 2007-12-10 21:01:48 by jwe]
jwe
parents: 7017
diff changeset
479 %! if (value_bad)
72b5e1701da2 [project @ 2007-12-10 21:01:48 by jwe]
jwe
parents: 7017
diff changeset
480 %! printf_assert ("value bad\n");
72b5e1701da2 [project @ 2007-12-10 21:01:48 by jwe]
jwe
parents: 7017
diff changeset
481 %! else
72b5e1701da2 [project @ 2007-12-10 21:01:48 by jwe]
jwe
parents: 7017
diff changeset
482 %! printf_assert ("value good\n");
72b5e1701da2 [project @ 2007-12-10 21:01:48 by jwe]
jwe
parents: 7017
diff changeset
483 %! endif
72b5e1701da2 [project @ 2007-12-10 21:01:48 by jwe]
jwe
parents: 7017
diff changeset
484 %! assert(prog_output_assert("info good\nsolution good\nvalue good"));
72b5e1701da2 [project @ 2007-12-10 21:01:48 by jwe]
jwe
parents: 7017
diff changeset
485
72b5e1701da2 [project @ 2007-12-10 21:01:48 by jwe]
jwe
parents: 7017
diff changeset
486 %!function retval = f (p)
72b5e1701da2 [project @ 2007-12-10 21:01:48 by jwe]
jwe
parents: 7017
diff changeset
487 %! x = p(1);
72b5e1701da2 [project @ 2007-12-10 21:01:48 by jwe]
jwe
parents: 7017
diff changeset
488 %! y = p(2);
72b5e1701da2 [project @ 2007-12-10 21:01:48 by jwe]
jwe
parents: 7017
diff changeset
489 %! z = p(3);
72b5e1701da2 [project @ 2007-12-10 21:01:48 by jwe]
jwe
parents: 7017
diff changeset
490 %! w = p(4);
72b5e1701da2 [project @ 2007-12-10 21:01:48 by jwe]
jwe
parents: 7017
diff changeset
491 %! retval = zeros (4, 1);
72b5e1701da2 [project @ 2007-12-10 21:01:48 by jwe]
jwe
parents: 7017
diff changeset
492 %! retval(1) = 3*x + 4*y + exp (z + w) - 1.007;
72b5e1701da2 [project @ 2007-12-10 21:01:48 by jwe]
jwe
parents: 7017
diff changeset
493 %! retval(2) = 6*x - 4*y + exp (3*z + w) - 11;
72b5e1701da2 [project @ 2007-12-10 21:01:48 by jwe]
jwe
parents: 7017
diff changeset
494 %! retval(3) = x^4 - 4*y^2 + 6*z - 8*w - 20;
72b5e1701da2 [project @ 2007-12-10 21:01:48 by jwe]
jwe
parents: 7017
diff changeset
495 %! retval(4) = x^2 + 2*y^3 + z - w - 4;
72b5e1701da2 [project @ 2007-12-10 21:01:48 by jwe]
jwe
parents: 7017
diff changeset
496 %!test
7892
7ca2735d74c2 simplify & cleanup octave_value::XXX_vector_value functions
Jaroslav Hajek <highegg@gmail.com>
parents: 7509
diff changeset
497 %! x_opt = [ -0.767297326653401, 0.590671081117440, 1.47190018629642, -1.52719341133957 ];
7279
72b5e1701da2 [project @ 2007-12-10 21:01:48 by jwe]
jwe
parents: 7017
diff changeset
498 %! tol = 1.0e-5;
72b5e1701da2 [project @ 2007-12-10 21:01:48 by jwe]
jwe
parents: 7017
diff changeset
499 %! [x, fval, info] = fsolve ("f", [-1, 1, 2, -1]);
72b5e1701da2 [project @ 2007-12-10 21:01:48 by jwe]
jwe
parents: 7017
diff changeset
500 %! info_bad = (info != 1);
72b5e1701da2 [project @ 2007-12-10 21:01:48 by jwe]
jwe
parents: 7017
diff changeset
501 %! solution_bad = sum (abs (x - x_opt) > tol);
72b5e1701da2 [project @ 2007-12-10 21:01:48 by jwe]
jwe
parents: 7017
diff changeset
502 %! value_bad = sum (abs (fval) > tol);
72b5e1701da2 [project @ 2007-12-10 21:01:48 by jwe]
jwe
parents: 7017
diff changeset
503 %! if (info_bad)
72b5e1701da2 [project @ 2007-12-10 21:01:48 by jwe]
jwe
parents: 7017
diff changeset
504 %! printf_assert ("info bad\n");
72b5e1701da2 [project @ 2007-12-10 21:01:48 by jwe]
jwe
parents: 7017
diff changeset
505 %! else
72b5e1701da2 [project @ 2007-12-10 21:01:48 by jwe]
jwe
parents: 7017
diff changeset
506 %! printf_assert ("info good\n");
72b5e1701da2 [project @ 2007-12-10 21:01:48 by jwe]
jwe
parents: 7017
diff changeset
507 %! endif
72b5e1701da2 [project @ 2007-12-10 21:01:48 by jwe]
jwe
parents: 7017
diff changeset
508 %! if (solution_bad)
72b5e1701da2 [project @ 2007-12-10 21:01:48 by jwe]
jwe
parents: 7017
diff changeset
509 %! printf_assert ("solution bad\n");
72b5e1701da2 [project @ 2007-12-10 21:01:48 by jwe]
jwe
parents: 7017
diff changeset
510 %! else
72b5e1701da2 [project @ 2007-12-10 21:01:48 by jwe]
jwe
parents: 7017
diff changeset
511 %! printf_assert ("solution good\n");
72b5e1701da2 [project @ 2007-12-10 21:01:48 by jwe]
jwe
parents: 7017
diff changeset
512 %! endif
72b5e1701da2 [project @ 2007-12-10 21:01:48 by jwe]
jwe
parents: 7017
diff changeset
513 %! if (value_bad)
72b5e1701da2 [project @ 2007-12-10 21:01:48 by jwe]
jwe
parents: 7017
diff changeset
514 %! printf_assert ("value bad\n");
72b5e1701da2 [project @ 2007-12-10 21:01:48 by jwe]
jwe
parents: 7017
diff changeset
515 %! else
72b5e1701da2 [project @ 2007-12-10 21:01:48 by jwe]
jwe
parents: 7017
diff changeset
516 %! printf_assert ("value good\n");
72b5e1701da2 [project @ 2007-12-10 21:01:48 by jwe]
jwe
parents: 7017
diff changeset
517 %! endif
72b5e1701da2 [project @ 2007-12-10 21:01:48 by jwe]
jwe
parents: 7017
diff changeset
518 %! assert(prog_output_assert("info good\nsolution good\nvalue good"));
72b5e1701da2 [project @ 2007-12-10 21:01:48 by jwe]
jwe
parents: 7017
diff changeset
519
72b5e1701da2 [project @ 2007-12-10 21:01:48 by jwe]
jwe
parents: 7017
diff changeset
520 %!test
72b5e1701da2 [project @ 2007-12-10 21:01:48 by jwe]
jwe
parents: 7017
diff changeset
521 %! fsolve_options ("tolerance", eps);
72b5e1701da2 [project @ 2007-12-10 21:01:48 by jwe]
jwe
parents: 7017
diff changeset
522 %! assert(fsolve_options ("tolerance") == eps);
72b5e1701da2 [project @ 2007-12-10 21:01:48 by jwe]
jwe
parents: 7017
diff changeset
523
72b5e1701da2 [project @ 2007-12-10 21:01:48 by jwe]
jwe
parents: 7017
diff changeset
524 %!error <Invalid call to fsolve_options.*> fsolve_options ("foo", 1, 2);
72b5e1701da2 [project @ 2007-12-10 21:01:48 by jwe]
jwe
parents: 7017
diff changeset
525 */
72b5e1701da2 [project @ 2007-12-10 21:01:48 by jwe]
jwe
parents: 7017
diff changeset
526
72b5e1701da2 [project @ 2007-12-10 21:01:48 by jwe]
jwe
parents: 7017
diff changeset
527 /*
2928
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
528 ;;; Local Variables: ***
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
529 ;;; mode: C++ ***
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
530 ;;; End: ***
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
531 */