| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Octave can solve sets of nonlinear equations of the form
F (x) = 0 |
using the function fsolve, which is based on the MINPACK
subroutine hybrd. This is an iterative technique so a starting
point will have to be provided. This also has the consequence that
convergence is not guarantied even if a solution exists.
Given fcn, the name of a function of the form f (x)
and an initial starting point x0, fsolve solves the set of
equations such that f(x) == 0.
If fcn is a two-element string array, or a two element cell array
containing either the function name or inline or function handle. The
first element names the function f described above, and the second
element names a function of the form j (x) to compute the
Jacobian matrix with elements
You can use the function fsolve_options to set optional
parameters for fsolve.
When called with two arguments, this function allows you set options
parameters for the function fsolve. Given one argument,
fsolve_options returns the value of the corresponding option. If
no arguments are supplied, the names of all the available options and
their current values are displayed.
Options include
"tolerance"Nonnegative relative tolerance.
Here is a complete example. To solve the set of equations
you first need to write a function to compute the value of the given function. For example:
function y = f (x) y(1) = -2*x(1)^2 + 3*x(1)*x(2) + 4*sin(x(2)) - 6; y(2) = 3*x(1)^2 - 2*x(1)*x(2)^2 + 3*cos(x(1)) + 4; endfunction |
Then, call fsolve with a specified initial condition to find the
roots of the system of equations. For example, given the function
f defined above,
[x, info] = fsolve (@f, [1; 2]) |
results in the solution
x = 0.57983 2.54621 info = 1 |
A value of info = 1 indicates that the solution has converged.
The function perror may be used to print English messages
corresponding to the numeric error codes. For example,
perror ("fsolve", 1)
-| solution converged to requested tolerance
|
When no Jacobian is supplied (as in the example above) it is approximated numerically. This requires more function evaluations, and hence is less efficient. In the example above we could compute the Jacobian analytically as
function J = jacobian(x) J(1,1) = 3*x(2) - 4*x(1); J(1,2) = 4*cos(x(2)) + 3*x(1); J(2,1) = -2*x(2)^2 - 3*sin(x(1)) + 6*x(1); J(2,2) = -4*x(1)*x(2); endfunction |
Using this Jacobian is done with the following code
[x, info] = fsolve ({@f, @jacobian}, [1; 2]);
|
which gives the same solution as before.
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] |
This document was generated on December, 26 2007 using texi2html 1.76.