comparison libs/commons-math-2.1/docs/apidocs/src-html/org/apache/commons/math/optimization/fitting/PolynomialFitter.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.optimization.fitting;<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.analysis.polynomials.PolynomialFunction;<a name="line.22"></a>
26 <FONT color="green">023</FONT> import org.apache.commons.math.optimization.DifferentiableMultivariateVectorialOptimizer;<a name="line.23"></a>
27 <FONT color="green">024</FONT> import org.apache.commons.math.optimization.OptimizationException;<a name="line.24"></a>
28 <FONT color="green">025</FONT> <a name="line.25"></a>
29 <FONT color="green">026</FONT> /** This class implements a curve fitting specialized for polynomials.<a name="line.26"></a>
30 <FONT color="green">027</FONT> * &lt;p&gt;Polynomial fitting is a very simple case of curve fitting. The<a name="line.27"></a>
31 <FONT color="green">028</FONT> * estimated coefficients are the polynomial coefficients. They are<a name="line.28"></a>
32 <FONT color="green">029</FONT> * searched by a least square estimator.&lt;/p&gt;<a name="line.29"></a>
33 <FONT color="green">030</FONT> * @version $Revision: 811685 $ $Date: 2009-09-05 13:36:48 -0400 (Sat, 05 Sep 2009) $<a name="line.30"></a>
34 <FONT color="green">031</FONT> * @since 2.0<a name="line.31"></a>
35 <FONT color="green">032</FONT> */<a name="line.32"></a>
36 <FONT color="green">033</FONT> <a name="line.33"></a>
37 <FONT color="green">034</FONT> public class PolynomialFitter {<a name="line.34"></a>
38 <FONT color="green">035</FONT> <a name="line.35"></a>
39 <FONT color="green">036</FONT> /** Fitter for the coefficients. */<a name="line.36"></a>
40 <FONT color="green">037</FONT> private final CurveFitter fitter;<a name="line.37"></a>
41 <FONT color="green">038</FONT> <a name="line.38"></a>
42 <FONT color="green">039</FONT> /** Polynomial degree. */<a name="line.39"></a>
43 <FONT color="green">040</FONT> private final int degree;<a name="line.40"></a>
44 <FONT color="green">041</FONT> <a name="line.41"></a>
45 <FONT color="green">042</FONT> /** Simple constructor.<a name="line.42"></a>
46 <FONT color="green">043</FONT> * &lt;p&gt;The polynomial fitter built this way are complete polynomials,<a name="line.43"></a>
47 <FONT color="green">044</FONT> * ie. a n-degree polynomial has n+1 coefficients.&lt;/p&gt;<a name="line.44"></a>
48 <FONT color="green">045</FONT> * @param degree maximal degree of the polynomial<a name="line.45"></a>
49 <FONT color="green">046</FONT> * @param optimizer optimizer to use for the fitting<a name="line.46"></a>
50 <FONT color="green">047</FONT> */<a name="line.47"></a>
51 <FONT color="green">048</FONT> public PolynomialFitter(int degree, final DifferentiableMultivariateVectorialOptimizer optimizer) {<a name="line.48"></a>
52 <FONT color="green">049</FONT> this.fitter = new CurveFitter(optimizer);<a name="line.49"></a>
53 <FONT color="green">050</FONT> this.degree = degree;<a name="line.50"></a>
54 <FONT color="green">051</FONT> }<a name="line.51"></a>
55 <FONT color="green">052</FONT> <a name="line.52"></a>
56 <FONT color="green">053</FONT> /** Add an observed weighted (x,y) point to the sample.<a name="line.53"></a>
57 <FONT color="green">054</FONT> * @param weight weight of the observed point in the fit<a name="line.54"></a>
58 <FONT color="green">055</FONT> * @param x abscissa of the point<a name="line.55"></a>
59 <FONT color="green">056</FONT> * @param y observed value of the point at x, after fitting we should<a name="line.56"></a>
60 <FONT color="green">057</FONT> * have P(x) as close as possible to this value<a name="line.57"></a>
61 <FONT color="green">058</FONT> */<a name="line.58"></a>
62 <FONT color="green">059</FONT> public void addObservedPoint(double weight, double x, double y) {<a name="line.59"></a>
63 <FONT color="green">060</FONT> fitter.addObservedPoint(weight, x, y);<a name="line.60"></a>
64 <FONT color="green">061</FONT> }<a name="line.61"></a>
65 <FONT color="green">062</FONT> <a name="line.62"></a>
66 <FONT color="green">063</FONT> /** Get the polynomial fitting the weighted (x, y) points.<a name="line.63"></a>
67 <FONT color="green">064</FONT> * @return polynomial function best fitting the observed points<a name="line.64"></a>
68 <FONT color="green">065</FONT> * @exception OptimizationException if the algorithm failed to converge<a name="line.65"></a>
69 <FONT color="green">066</FONT> */<a name="line.66"></a>
70 <FONT color="green">067</FONT> public PolynomialFunction fit()<a name="line.67"></a>
71 <FONT color="green">068</FONT> throws OptimizationException {<a name="line.68"></a>
72 <FONT color="green">069</FONT> try {<a name="line.69"></a>
73 <FONT color="green">070</FONT> return new PolynomialFunction(fitter.fit(new ParametricPolynomial(), new double[degree + 1]));<a name="line.70"></a>
74 <FONT color="green">071</FONT> } catch (FunctionEvaluationException fee) {<a name="line.71"></a>
75 <FONT color="green">072</FONT> // this should never happen<a name="line.72"></a>
76 <FONT color="green">073</FONT> throw MathRuntimeException.createInternalError(fee);<a name="line.73"></a>
77 <FONT color="green">074</FONT> }<a name="line.74"></a>
78 <FONT color="green">075</FONT> }<a name="line.75"></a>
79 <FONT color="green">076</FONT> <a name="line.76"></a>
80 <FONT color="green">077</FONT> /** Dedicated parametric polynomial class. */<a name="line.77"></a>
81 <FONT color="green">078</FONT> private static class ParametricPolynomial implements ParametricRealFunction {<a name="line.78"></a>
82 <FONT color="green">079</FONT> <a name="line.79"></a>
83 <FONT color="green">080</FONT> /** {@inheritDoc} */<a name="line.80"></a>
84 <FONT color="green">081</FONT> public double[] gradient(double x, double[] parameters)<a name="line.81"></a>
85 <FONT color="green">082</FONT> throws FunctionEvaluationException {<a name="line.82"></a>
86 <FONT color="green">083</FONT> final double[] gradient = new double[parameters.length];<a name="line.83"></a>
87 <FONT color="green">084</FONT> double xn = 1.0;<a name="line.84"></a>
88 <FONT color="green">085</FONT> for (int i = 0; i &lt; parameters.length; ++i) {<a name="line.85"></a>
89 <FONT color="green">086</FONT> gradient[i] = xn;<a name="line.86"></a>
90 <FONT color="green">087</FONT> xn *= x;<a name="line.87"></a>
91 <FONT color="green">088</FONT> }<a name="line.88"></a>
92 <FONT color="green">089</FONT> return gradient;<a name="line.89"></a>
93 <FONT color="green">090</FONT> }<a name="line.90"></a>
94 <FONT color="green">091</FONT> <a name="line.91"></a>
95 <FONT color="green">092</FONT> /** {@inheritDoc} */<a name="line.92"></a>
96 <FONT color="green">093</FONT> public double value(final double x, final double[] parameters) {<a name="line.93"></a>
97 <FONT color="green">094</FONT> double y = 0;<a name="line.94"></a>
98 <FONT color="green">095</FONT> for (int i = parameters.length - 1; i &gt;= 0; --i) {<a name="line.95"></a>
99 <FONT color="green">096</FONT> y = y * x + parameters[i];<a name="line.96"></a>
100 <FONT color="green">097</FONT> }<a name="line.97"></a>
101 <FONT color="green">098</FONT> return y;<a name="line.98"></a>
102 <FONT color="green">099</FONT> }<a name="line.99"></a>
103 <FONT color="green">100</FONT> <a name="line.100"></a>
104 <FONT color="green">101</FONT> }<a name="line.101"></a>
105 <FONT color="green">102</FONT> <a name="line.102"></a>
106 <FONT color="green">103</FONT> }<a name="line.103"></a>
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
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 </PRE>
168 </BODY>
169 </HTML>