comparison libs/commons-math-2.1/docs/apidocs/src-html/org/apache/commons/math/analysis/solvers/NewtonSolver.html @ 13:cbf34dd4d7e6

commons-math-2.1 added
author dwinter
date Tue, 04 Jan 2011 10:02:07 +0100
parents
children
comparison
equal deleted inserted replaced
12:970d26a94fb7 13:cbf34dd4d7e6
1 <HTML>
2 <BODY BGCOLOR="white">
3 <PRE>
4 <FONT color="green">001</FONT> /*<a name="line.1"></a>
5 <FONT color="green">002</FONT> * Licensed to the Apache Software Foundation (ASF) under one or more<a name="line.2"></a>
6 <FONT color="green">003</FONT> * contributor license agreements. See the NOTICE file distributed with<a name="line.3"></a>
7 <FONT color="green">004</FONT> * this work for additional information regarding copyright ownership.<a name="line.4"></a>
8 <FONT color="green">005</FONT> * The ASF licenses this file to You under the Apache License, Version 2.0<a name="line.5"></a>
9 <FONT color="green">006</FONT> * (the "License"); you may not use this file except in compliance with<a name="line.6"></a>
10 <FONT color="green">007</FONT> * the License. You may obtain a copy of the License at<a name="line.7"></a>
11 <FONT color="green">008</FONT> *<a name="line.8"></a>
12 <FONT color="green">009</FONT> * http://www.apache.org/licenses/LICENSE-2.0<a name="line.9"></a>
13 <FONT color="green">010</FONT> *<a name="line.10"></a>
14 <FONT color="green">011</FONT> * Unless required by applicable law or agreed to in writing, software<a name="line.11"></a>
15 <FONT color="green">012</FONT> * distributed under the License is distributed on an "AS IS" BASIS,<a name="line.12"></a>
16 <FONT color="green">013</FONT> * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.<a name="line.13"></a>
17 <FONT color="green">014</FONT> * See the License for the specific language governing permissions and<a name="line.14"></a>
18 <FONT color="green">015</FONT> * limitations under the License.<a name="line.15"></a>
19 <FONT color="green">016</FONT> */<a name="line.16"></a>
20 <FONT color="green">017</FONT> <a name="line.17"></a>
21 <FONT color="green">018</FONT> package org.apache.commons.math.analysis.solvers;<a name="line.18"></a>
22 <FONT color="green">019</FONT> <a name="line.19"></a>
23 <FONT color="green">020</FONT> import org.apache.commons.math.FunctionEvaluationException;<a name="line.20"></a>
24 <FONT color="green">021</FONT> import org.apache.commons.math.MathRuntimeException;<a name="line.21"></a>
25 <FONT color="green">022</FONT> import org.apache.commons.math.MaxIterationsExceededException;<a name="line.22"></a>
26 <FONT color="green">023</FONT> import org.apache.commons.math.analysis.DifferentiableUnivariateRealFunction;<a name="line.23"></a>
27 <FONT color="green">024</FONT> import org.apache.commons.math.analysis.UnivariateRealFunction;<a name="line.24"></a>
28 <FONT color="green">025</FONT> <a name="line.25"></a>
29 <FONT color="green">026</FONT> /**<a name="line.26"></a>
30 <FONT color="green">027</FONT> * Implements &lt;a href="http://mathworld.wolfram.com/NewtonsMethod.html"&gt;<a name="line.27"></a>
31 <FONT color="green">028</FONT> * Newton's Method&lt;/a&gt; for finding zeros of real univariate functions.<a name="line.28"></a>
32 <FONT color="green">029</FONT> * &lt;p&gt;<a name="line.29"></a>
33 <FONT color="green">030</FONT> * The function should be continuous but not necessarily smooth.&lt;/p&gt;<a name="line.30"></a>
34 <FONT color="green">031</FONT> *<a name="line.31"></a>
35 <FONT color="green">032</FONT> * @version $Revision: 811685 $ $Date: 2009-09-05 13:36:48 -0400 (Sat, 05 Sep 2009) $<a name="line.32"></a>
36 <FONT color="green">033</FONT> */<a name="line.33"></a>
37 <FONT color="green">034</FONT> public class NewtonSolver extends UnivariateRealSolverImpl {<a name="line.34"></a>
38 <FONT color="green">035</FONT> <a name="line.35"></a>
39 <FONT color="green">036</FONT> /**<a name="line.36"></a>
40 <FONT color="green">037</FONT> * Construct a solver for the given function.<a name="line.37"></a>
41 <FONT color="green">038</FONT> * @param f function to solve.<a name="line.38"></a>
42 <FONT color="green">039</FONT> * @deprecated as of 2.0 the function to solve is passed as an argument<a name="line.39"></a>
43 <FONT color="green">040</FONT> * to the {@link #solve(UnivariateRealFunction, double, double)} or<a name="line.40"></a>
44 <FONT color="green">041</FONT> * {@link UnivariateRealSolverImpl#solve(UnivariateRealFunction, double, double, double)}<a name="line.41"></a>
45 <FONT color="green">042</FONT> * method.<a name="line.42"></a>
46 <FONT color="green">043</FONT> */<a name="line.43"></a>
47 <FONT color="green">044</FONT> @Deprecated<a name="line.44"></a>
48 <FONT color="green">045</FONT> public NewtonSolver(DifferentiableUnivariateRealFunction f) {<a name="line.45"></a>
49 <FONT color="green">046</FONT> super(f, 100, 1E-6);<a name="line.46"></a>
50 <FONT color="green">047</FONT> }<a name="line.47"></a>
51 <FONT color="green">048</FONT> <a name="line.48"></a>
52 <FONT color="green">049</FONT> /**<a name="line.49"></a>
53 <FONT color="green">050</FONT> * Construct a solver.<a name="line.50"></a>
54 <FONT color="green">051</FONT> */<a name="line.51"></a>
55 <FONT color="green">052</FONT> public NewtonSolver() {<a name="line.52"></a>
56 <FONT color="green">053</FONT> super(100, 1E-6);<a name="line.53"></a>
57 <FONT color="green">054</FONT> }<a name="line.54"></a>
58 <FONT color="green">055</FONT> <a name="line.55"></a>
59 <FONT color="green">056</FONT> /** {@inheritDoc} */<a name="line.56"></a>
60 <FONT color="green">057</FONT> @Deprecated<a name="line.57"></a>
61 <FONT color="green">058</FONT> public double solve(final double min, final double max)<a name="line.58"></a>
62 <FONT color="green">059</FONT> throws MaxIterationsExceededException,<a name="line.59"></a>
63 <FONT color="green">060</FONT> FunctionEvaluationException {<a name="line.60"></a>
64 <FONT color="green">061</FONT> return solve(f, min, max);<a name="line.61"></a>
65 <FONT color="green">062</FONT> }<a name="line.62"></a>
66 <FONT color="green">063</FONT> <a name="line.63"></a>
67 <FONT color="green">064</FONT> /** {@inheritDoc} */<a name="line.64"></a>
68 <FONT color="green">065</FONT> @Deprecated<a name="line.65"></a>
69 <FONT color="green">066</FONT> public double solve(final double min, final double max, final double startValue)<a name="line.66"></a>
70 <FONT color="green">067</FONT> throws MaxIterationsExceededException, FunctionEvaluationException {<a name="line.67"></a>
71 <FONT color="green">068</FONT> return solve(f, min, max, startValue);<a name="line.68"></a>
72 <FONT color="green">069</FONT> }<a name="line.69"></a>
73 <FONT color="green">070</FONT> <a name="line.70"></a>
74 <FONT color="green">071</FONT> /**<a name="line.71"></a>
75 <FONT color="green">072</FONT> * Find a zero near the midpoint of &lt;code&gt;min&lt;/code&gt; and &lt;code&gt;max&lt;/code&gt;.<a name="line.72"></a>
76 <FONT color="green">073</FONT> *<a name="line.73"></a>
77 <FONT color="green">074</FONT> * @param f the function to solve<a name="line.74"></a>
78 <FONT color="green">075</FONT> * @param min the lower bound for the interval<a name="line.75"></a>
79 <FONT color="green">076</FONT> * @param max the upper bound for the interval<a name="line.76"></a>
80 <FONT color="green">077</FONT> * @return the value where the function is zero<a name="line.77"></a>
81 <FONT color="green">078</FONT> * @throws MaxIterationsExceededException if the maximum iteration count is exceeded<a name="line.78"></a>
82 <FONT color="green">079</FONT> * @throws FunctionEvaluationException if an error occurs evaluating the<a name="line.79"></a>
83 <FONT color="green">080</FONT> * function or derivative<a name="line.80"></a>
84 <FONT color="green">081</FONT> * @throws IllegalArgumentException if min is not less than max<a name="line.81"></a>
85 <FONT color="green">082</FONT> */<a name="line.82"></a>
86 <FONT color="green">083</FONT> public double solve(final UnivariateRealFunction f,<a name="line.83"></a>
87 <FONT color="green">084</FONT> final double min, final double max)<a name="line.84"></a>
88 <FONT color="green">085</FONT> throws MaxIterationsExceededException, FunctionEvaluationException {<a name="line.85"></a>
89 <FONT color="green">086</FONT> return solve(f, min, max, UnivariateRealSolverUtils.midpoint(min, max));<a name="line.86"></a>
90 <FONT color="green">087</FONT> }<a name="line.87"></a>
91 <FONT color="green">088</FONT> <a name="line.88"></a>
92 <FONT color="green">089</FONT> /**<a name="line.89"></a>
93 <FONT color="green">090</FONT> * Find a zero near the value &lt;code&gt;startValue&lt;/code&gt;.<a name="line.90"></a>
94 <FONT color="green">091</FONT> *<a name="line.91"></a>
95 <FONT color="green">092</FONT> * @param f the function to solve<a name="line.92"></a>
96 <FONT color="green">093</FONT> * @param min the lower bound for the interval (ignored).<a name="line.93"></a>
97 <FONT color="green">094</FONT> * @param max the upper bound for the interval (ignored).<a name="line.94"></a>
98 <FONT color="green">095</FONT> * @param startValue the start value to use.<a name="line.95"></a>
99 <FONT color="green">096</FONT> * @return the value where the function is zero<a name="line.96"></a>
100 <FONT color="green">097</FONT> * @throws MaxIterationsExceededException if the maximum iteration count is exceeded<a name="line.97"></a>
101 <FONT color="green">098</FONT> * @throws FunctionEvaluationException if an error occurs evaluating the<a name="line.98"></a>
102 <FONT color="green">099</FONT> * function or derivative<a name="line.99"></a>
103 <FONT color="green">100</FONT> * @throws IllegalArgumentException if startValue is not between min and max or<a name="line.100"></a>
104 <FONT color="green">101</FONT> * if function is not a {@link DifferentiableUnivariateRealFunction} instance<a name="line.101"></a>
105 <FONT color="green">102</FONT> */<a name="line.102"></a>
106 <FONT color="green">103</FONT> public double solve(final UnivariateRealFunction f,<a name="line.103"></a>
107 <FONT color="green">104</FONT> final double min, final double max, final double startValue)<a name="line.104"></a>
108 <FONT color="green">105</FONT> throws MaxIterationsExceededException, FunctionEvaluationException {<a name="line.105"></a>
109 <FONT color="green">106</FONT> <a name="line.106"></a>
110 <FONT color="green">107</FONT> try {<a name="line.107"></a>
111 <FONT color="green">108</FONT> <a name="line.108"></a>
112 <FONT color="green">109</FONT> final UnivariateRealFunction derivative =<a name="line.109"></a>
113 <FONT color="green">110</FONT> ((DifferentiableUnivariateRealFunction) f).derivative();<a name="line.110"></a>
114 <FONT color="green">111</FONT> clearResult();<a name="line.111"></a>
115 <FONT color="green">112</FONT> verifySequence(min, startValue, max);<a name="line.112"></a>
116 <FONT color="green">113</FONT> <a name="line.113"></a>
117 <FONT color="green">114</FONT> double x0 = startValue;<a name="line.114"></a>
118 <FONT color="green">115</FONT> double x1;<a name="line.115"></a>
119 <FONT color="green">116</FONT> <a name="line.116"></a>
120 <FONT color="green">117</FONT> int i = 0;<a name="line.117"></a>
121 <FONT color="green">118</FONT> while (i &lt; maximalIterationCount) {<a name="line.118"></a>
122 <FONT color="green">119</FONT> <a name="line.119"></a>
123 <FONT color="green">120</FONT> x1 = x0 - (f.value(x0) / derivative.value(x0));<a name="line.120"></a>
124 <FONT color="green">121</FONT> if (Math.abs(x1 - x0) &lt;= absoluteAccuracy) {<a name="line.121"></a>
125 <FONT color="green">122</FONT> setResult(x1, i);<a name="line.122"></a>
126 <FONT color="green">123</FONT> return x1;<a name="line.123"></a>
127 <FONT color="green">124</FONT> }<a name="line.124"></a>
128 <FONT color="green">125</FONT> <a name="line.125"></a>
129 <FONT color="green">126</FONT> x0 = x1;<a name="line.126"></a>
130 <FONT color="green">127</FONT> ++i;<a name="line.127"></a>
131 <FONT color="green">128</FONT> }<a name="line.128"></a>
132 <FONT color="green">129</FONT> <a name="line.129"></a>
133 <FONT color="green">130</FONT> throw new MaxIterationsExceededException(maximalIterationCount);<a name="line.130"></a>
134 <FONT color="green">131</FONT> } catch (ClassCastException cce) {<a name="line.131"></a>
135 <FONT color="green">132</FONT> throw MathRuntimeException.createIllegalArgumentException("function is not differentiable");<a name="line.132"></a>
136 <FONT color="green">133</FONT> }<a name="line.133"></a>
137 <FONT color="green">134</FONT> }<a name="line.134"></a>
138 <FONT color="green">135</FONT> <a name="line.135"></a>
139 <FONT color="green">136</FONT> }<a name="line.136"></a>
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200 </PRE>
201 </BODY>
202 </HTML>