comparison libs/commons-math-2.1/docs/apidocs/src-html/org/apache/commons/math/analysis/polynomials/PolynomialFunction.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> package org.apache.commons.math.analysis.polynomials;<a name="line.17"></a>
21 <FONT color="green">018</FONT> <a name="line.18"></a>
22 <FONT color="green">019</FONT> import java.io.Serializable;<a name="line.19"></a>
23 <FONT color="green">020</FONT> import java.util.Arrays;<a name="line.20"></a>
24 <FONT color="green">021</FONT> <a name="line.21"></a>
25 <FONT color="green">022</FONT> import org.apache.commons.math.MathRuntimeException;<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> * Immutable representation of a real polynomial function with real coefficients.<a name="line.27"></a>
31 <FONT color="green">028</FONT> * &lt;p&gt;<a name="line.28"></a>
32 <FONT color="green">029</FONT> * &lt;a href="http://mathworld.wolfram.com/HornersMethod.html"&gt;Horner's Method&lt;/a&gt;<a name="line.29"></a>
33 <FONT color="green">030</FONT> * is used to evaluate the function.&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: 922714 $ $Date: 2010-03-13 20:35:14 -0500 (Sat, 13 Mar 2010) $<a name="line.32"></a>
36 <FONT color="green">033</FONT> */<a name="line.33"></a>
37 <FONT color="green">034</FONT> public class PolynomialFunction implements DifferentiableUnivariateRealFunction, Serializable {<a name="line.34"></a>
38 <FONT color="green">035</FONT> <a name="line.35"></a>
39 <FONT color="green">036</FONT> /** Message for empty coefficients array. */<a name="line.36"></a>
40 <FONT color="green">037</FONT> private static final String EMPTY_ARRAY_MESSAGE =<a name="line.37"></a>
41 <FONT color="green">038</FONT> "empty polynomials coefficients array";<a name="line.38"></a>
42 <FONT color="green">039</FONT> <a name="line.39"></a>
43 <FONT color="green">040</FONT> /**<a name="line.40"></a>
44 <FONT color="green">041</FONT> * Serialization identifier<a name="line.41"></a>
45 <FONT color="green">042</FONT> */<a name="line.42"></a>
46 <FONT color="green">043</FONT> private static final long serialVersionUID = -7726511984200295583L;<a name="line.43"></a>
47 <FONT color="green">044</FONT> <a name="line.44"></a>
48 <FONT color="green">045</FONT> /**<a name="line.45"></a>
49 <FONT color="green">046</FONT> * The coefficients of the polynomial, ordered by degree -- i.e.,<a name="line.46"></a>
50 <FONT color="green">047</FONT> * coefficients[0] is the constant term and coefficients[n] is the<a name="line.47"></a>
51 <FONT color="green">048</FONT> * coefficient of x^n where n is the degree of the polynomial.<a name="line.48"></a>
52 <FONT color="green">049</FONT> */<a name="line.49"></a>
53 <FONT color="green">050</FONT> private final double coefficients[];<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> * Construct a polynomial with the given coefficients. The first element<a name="line.53"></a>
57 <FONT color="green">054</FONT> * of the coefficients array is the constant term. Higher degree<a name="line.54"></a>
58 <FONT color="green">055</FONT> * coefficients follow in sequence. The degree of the resulting polynomial<a name="line.55"></a>
59 <FONT color="green">056</FONT> * is the index of the last non-null element of the array, or 0 if all elements<a name="line.56"></a>
60 <FONT color="green">057</FONT> * are null.<a name="line.57"></a>
61 <FONT color="green">058</FONT> * &lt;p&gt;<a name="line.58"></a>
62 <FONT color="green">059</FONT> * The constructor makes a copy of the input array and assigns the copy to<a name="line.59"></a>
63 <FONT color="green">060</FONT> * the coefficients property.&lt;/p&gt;<a name="line.60"></a>
64 <FONT color="green">061</FONT> *<a name="line.61"></a>
65 <FONT color="green">062</FONT> * @param c polynomial coefficients<a name="line.62"></a>
66 <FONT color="green">063</FONT> * @throws NullPointerException if c is null<a name="line.63"></a>
67 <FONT color="green">064</FONT> * @throws IllegalArgumentException if c is empty<a name="line.64"></a>
68 <FONT color="green">065</FONT> */<a name="line.65"></a>
69 <FONT color="green">066</FONT> public PolynomialFunction(double c[]) {<a name="line.66"></a>
70 <FONT color="green">067</FONT> super();<a name="line.67"></a>
71 <FONT color="green">068</FONT> if (c.length &lt; 1) {<a name="line.68"></a>
72 <FONT color="green">069</FONT> throw MathRuntimeException.createIllegalArgumentException(EMPTY_ARRAY_MESSAGE);<a name="line.69"></a>
73 <FONT color="green">070</FONT> }<a name="line.70"></a>
74 <FONT color="green">071</FONT> int l = c.length;<a name="line.71"></a>
75 <FONT color="green">072</FONT> while ((l &gt; 1) &amp;&amp; (c[l - 1] == 0)) {<a name="line.72"></a>
76 <FONT color="green">073</FONT> --l;<a name="line.73"></a>
77 <FONT color="green">074</FONT> }<a name="line.74"></a>
78 <FONT color="green">075</FONT> this.coefficients = new double[l];<a name="line.75"></a>
79 <FONT color="green">076</FONT> System.arraycopy(c, 0, this.coefficients, 0, l);<a name="line.76"></a>
80 <FONT color="green">077</FONT> }<a name="line.77"></a>
81 <FONT color="green">078</FONT> <a name="line.78"></a>
82 <FONT color="green">079</FONT> /**<a name="line.79"></a>
83 <FONT color="green">080</FONT> * Compute the value of the function for the given argument.<a name="line.80"></a>
84 <FONT color="green">081</FONT> * &lt;p&gt;<a name="line.81"></a>
85 <FONT color="green">082</FONT> * The value returned is &lt;br&gt;<a name="line.82"></a>
86 <FONT color="green">083</FONT> * &lt;code&gt;coefficients[n] * x^n + ... + coefficients[1] * x + coefficients[0]&lt;/code&gt;<a name="line.83"></a>
87 <FONT color="green">084</FONT> * &lt;/p&gt;<a name="line.84"></a>
88 <FONT color="green">085</FONT> *<a name="line.85"></a>
89 <FONT color="green">086</FONT> * @param x the argument for which the function value should be computed<a name="line.86"></a>
90 <FONT color="green">087</FONT> * @return the value of the polynomial at the given point<a name="line.87"></a>
91 <FONT color="green">088</FONT> * @see UnivariateRealFunction#value(double)<a name="line.88"></a>
92 <FONT color="green">089</FONT> */<a name="line.89"></a>
93 <FONT color="green">090</FONT> public double value(double x) {<a name="line.90"></a>
94 <FONT color="green">091</FONT> return evaluate(coefficients, x);<a name="line.91"></a>
95 <FONT color="green">092</FONT> }<a name="line.92"></a>
96 <FONT color="green">093</FONT> <a name="line.93"></a>
97 <FONT color="green">094</FONT> <a name="line.94"></a>
98 <FONT color="green">095</FONT> /**<a name="line.95"></a>
99 <FONT color="green">096</FONT> * Returns the degree of the polynomial<a name="line.96"></a>
100 <FONT color="green">097</FONT> *<a name="line.97"></a>
101 <FONT color="green">098</FONT> * @return the degree of the polynomial<a name="line.98"></a>
102 <FONT color="green">099</FONT> */<a name="line.99"></a>
103 <FONT color="green">100</FONT> public int degree() {<a name="line.100"></a>
104 <FONT color="green">101</FONT> return coefficients.length - 1;<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 <FONT color="green">104</FONT> /**<a name="line.104"></a>
108 <FONT color="green">105</FONT> * Returns a copy of the coefficients array.<a name="line.105"></a>
109 <FONT color="green">106</FONT> * &lt;p&gt;<a name="line.106"></a>
110 <FONT color="green">107</FONT> * Changes made to the returned copy will not affect the coefficients of<a name="line.107"></a>
111 <FONT color="green">108</FONT> * the polynomial.&lt;/p&gt;<a name="line.108"></a>
112 <FONT color="green">109</FONT> *<a name="line.109"></a>
113 <FONT color="green">110</FONT> * @return a fresh copy of the coefficients array<a name="line.110"></a>
114 <FONT color="green">111</FONT> */<a name="line.111"></a>
115 <FONT color="green">112</FONT> public double[] getCoefficients() {<a name="line.112"></a>
116 <FONT color="green">113</FONT> return coefficients.clone();<a name="line.113"></a>
117 <FONT color="green">114</FONT> }<a name="line.114"></a>
118 <FONT color="green">115</FONT> <a name="line.115"></a>
119 <FONT color="green">116</FONT> /**<a name="line.116"></a>
120 <FONT color="green">117</FONT> * Uses Horner's Method to evaluate the polynomial with the given coefficients at<a name="line.117"></a>
121 <FONT color="green">118</FONT> * the argument.<a name="line.118"></a>
122 <FONT color="green">119</FONT> *<a name="line.119"></a>
123 <FONT color="green">120</FONT> * @param coefficients the coefficients of the polynomial to evaluate<a name="line.120"></a>
124 <FONT color="green">121</FONT> * @param argument the input value<a name="line.121"></a>
125 <FONT color="green">122</FONT> * @return the value of the polynomial<a name="line.122"></a>
126 <FONT color="green">123</FONT> * @throws IllegalArgumentException if coefficients is empty<a name="line.123"></a>
127 <FONT color="green">124</FONT> * @throws NullPointerException if coefficients is null<a name="line.124"></a>
128 <FONT color="green">125</FONT> */<a name="line.125"></a>
129 <FONT color="green">126</FONT> protected static double evaluate(double[] coefficients, double argument) {<a name="line.126"></a>
130 <FONT color="green">127</FONT> int n = coefficients.length;<a name="line.127"></a>
131 <FONT color="green">128</FONT> if (n &lt; 1) {<a name="line.128"></a>
132 <FONT color="green">129</FONT> throw MathRuntimeException.createIllegalArgumentException(EMPTY_ARRAY_MESSAGE);<a name="line.129"></a>
133 <FONT color="green">130</FONT> }<a name="line.130"></a>
134 <FONT color="green">131</FONT> double result = coefficients[n - 1];<a name="line.131"></a>
135 <FONT color="green">132</FONT> for (int j = n -2; j &gt;=0; j--) {<a name="line.132"></a>
136 <FONT color="green">133</FONT> result = argument * result + coefficients[j];<a name="line.133"></a>
137 <FONT color="green">134</FONT> }<a name="line.134"></a>
138 <FONT color="green">135</FONT> return result;<a name="line.135"></a>
139 <FONT color="green">136</FONT> }<a name="line.136"></a>
140 <FONT color="green">137</FONT> <a name="line.137"></a>
141 <FONT color="green">138</FONT> /**<a name="line.138"></a>
142 <FONT color="green">139</FONT> * Add a polynomial to the instance.<a name="line.139"></a>
143 <FONT color="green">140</FONT> * @param p polynomial to add<a name="line.140"></a>
144 <FONT color="green">141</FONT> * @return a new polynomial which is the sum of the instance and p<a name="line.141"></a>
145 <FONT color="green">142</FONT> */<a name="line.142"></a>
146 <FONT color="green">143</FONT> public PolynomialFunction add(final PolynomialFunction p) {<a name="line.143"></a>
147 <FONT color="green">144</FONT> <a name="line.144"></a>
148 <FONT color="green">145</FONT> // identify the lowest degree polynomial<a name="line.145"></a>
149 <FONT color="green">146</FONT> final int lowLength = Math.min(coefficients.length, p.coefficients.length);<a name="line.146"></a>
150 <FONT color="green">147</FONT> final int highLength = Math.max(coefficients.length, p.coefficients.length);<a name="line.147"></a>
151 <FONT color="green">148</FONT> <a name="line.148"></a>
152 <FONT color="green">149</FONT> // build the coefficients array<a name="line.149"></a>
153 <FONT color="green">150</FONT> double[] newCoefficients = new double[highLength];<a name="line.150"></a>
154 <FONT color="green">151</FONT> for (int i = 0; i &lt; lowLength; ++i) {<a name="line.151"></a>
155 <FONT color="green">152</FONT> newCoefficients[i] = coefficients[i] + p.coefficients[i];<a name="line.152"></a>
156 <FONT color="green">153</FONT> }<a name="line.153"></a>
157 <FONT color="green">154</FONT> System.arraycopy((coefficients.length &lt; p.coefficients.length) ?<a name="line.154"></a>
158 <FONT color="green">155</FONT> p.coefficients : coefficients,<a name="line.155"></a>
159 <FONT color="green">156</FONT> lowLength,<a name="line.156"></a>
160 <FONT color="green">157</FONT> newCoefficients, lowLength,<a name="line.157"></a>
161 <FONT color="green">158</FONT> highLength - lowLength);<a name="line.158"></a>
162 <FONT color="green">159</FONT> <a name="line.159"></a>
163 <FONT color="green">160</FONT> return new PolynomialFunction(newCoefficients);<a name="line.160"></a>
164 <FONT color="green">161</FONT> <a name="line.161"></a>
165 <FONT color="green">162</FONT> }<a name="line.162"></a>
166 <FONT color="green">163</FONT> <a name="line.163"></a>
167 <FONT color="green">164</FONT> /**<a name="line.164"></a>
168 <FONT color="green">165</FONT> * Subtract a polynomial from the instance.<a name="line.165"></a>
169 <FONT color="green">166</FONT> * @param p polynomial to subtract<a name="line.166"></a>
170 <FONT color="green">167</FONT> * @return a new polynomial which is the difference the instance minus p<a name="line.167"></a>
171 <FONT color="green">168</FONT> */<a name="line.168"></a>
172 <FONT color="green">169</FONT> public PolynomialFunction subtract(final PolynomialFunction p) {<a name="line.169"></a>
173 <FONT color="green">170</FONT> <a name="line.170"></a>
174 <FONT color="green">171</FONT> // identify the lowest degree polynomial<a name="line.171"></a>
175 <FONT color="green">172</FONT> int lowLength = Math.min(coefficients.length, p.coefficients.length);<a name="line.172"></a>
176 <FONT color="green">173</FONT> int highLength = Math.max(coefficients.length, p.coefficients.length);<a name="line.173"></a>
177 <FONT color="green">174</FONT> <a name="line.174"></a>
178 <FONT color="green">175</FONT> // build the coefficients array<a name="line.175"></a>
179 <FONT color="green">176</FONT> double[] newCoefficients = new double[highLength];<a name="line.176"></a>
180 <FONT color="green">177</FONT> for (int i = 0; i &lt; lowLength; ++i) {<a name="line.177"></a>
181 <FONT color="green">178</FONT> newCoefficients[i] = coefficients[i] - p.coefficients[i];<a name="line.178"></a>
182 <FONT color="green">179</FONT> }<a name="line.179"></a>
183 <FONT color="green">180</FONT> if (coefficients.length &lt; p.coefficients.length) {<a name="line.180"></a>
184 <FONT color="green">181</FONT> for (int i = lowLength; i &lt; highLength; ++i) {<a name="line.181"></a>
185 <FONT color="green">182</FONT> newCoefficients[i] = -p.coefficients[i];<a name="line.182"></a>
186 <FONT color="green">183</FONT> }<a name="line.183"></a>
187 <FONT color="green">184</FONT> } else {<a name="line.184"></a>
188 <FONT color="green">185</FONT> System.arraycopy(coefficients, lowLength, newCoefficients, lowLength,<a name="line.185"></a>
189 <FONT color="green">186</FONT> highLength - lowLength);<a name="line.186"></a>
190 <FONT color="green">187</FONT> }<a name="line.187"></a>
191 <FONT color="green">188</FONT> <a name="line.188"></a>
192 <FONT color="green">189</FONT> return new PolynomialFunction(newCoefficients);<a name="line.189"></a>
193 <FONT color="green">190</FONT> <a name="line.190"></a>
194 <FONT color="green">191</FONT> }<a name="line.191"></a>
195 <FONT color="green">192</FONT> <a name="line.192"></a>
196 <FONT color="green">193</FONT> /**<a name="line.193"></a>
197 <FONT color="green">194</FONT> * Negate the instance.<a name="line.194"></a>
198 <FONT color="green">195</FONT> * @return a new polynomial<a name="line.195"></a>
199 <FONT color="green">196</FONT> */<a name="line.196"></a>
200 <FONT color="green">197</FONT> public PolynomialFunction negate() {<a name="line.197"></a>
201 <FONT color="green">198</FONT> double[] newCoefficients = new double[coefficients.length];<a name="line.198"></a>
202 <FONT color="green">199</FONT> for (int i = 0; i &lt; coefficients.length; ++i) {<a name="line.199"></a>
203 <FONT color="green">200</FONT> newCoefficients[i] = -coefficients[i];<a name="line.200"></a>
204 <FONT color="green">201</FONT> }<a name="line.201"></a>
205 <FONT color="green">202</FONT> return new PolynomialFunction(newCoefficients);<a name="line.202"></a>
206 <FONT color="green">203</FONT> }<a name="line.203"></a>
207 <FONT color="green">204</FONT> <a name="line.204"></a>
208 <FONT color="green">205</FONT> /**<a name="line.205"></a>
209 <FONT color="green">206</FONT> * Multiply the instance by a polynomial.<a name="line.206"></a>
210 <FONT color="green">207</FONT> * @param p polynomial to multiply by<a name="line.207"></a>
211 <FONT color="green">208</FONT> * @return a new polynomial<a name="line.208"></a>
212 <FONT color="green">209</FONT> */<a name="line.209"></a>
213 <FONT color="green">210</FONT> public PolynomialFunction multiply(final PolynomialFunction p) {<a name="line.210"></a>
214 <FONT color="green">211</FONT> <a name="line.211"></a>
215 <FONT color="green">212</FONT> double[] newCoefficients = new double[coefficients.length + p.coefficients.length - 1];<a name="line.212"></a>
216 <FONT color="green">213</FONT> <a name="line.213"></a>
217 <FONT color="green">214</FONT> for (int i = 0; i &lt; newCoefficients.length; ++i) {<a name="line.214"></a>
218 <FONT color="green">215</FONT> newCoefficients[i] = 0.0;<a name="line.215"></a>
219 <FONT color="green">216</FONT> for (int j = Math.max(0, i + 1 - p.coefficients.length);<a name="line.216"></a>
220 <FONT color="green">217</FONT> j &lt; Math.min(coefficients.length, i + 1);<a name="line.217"></a>
221 <FONT color="green">218</FONT> ++j) {<a name="line.218"></a>
222 <FONT color="green">219</FONT> newCoefficients[i] += coefficients[j] * p.coefficients[i-j];<a name="line.219"></a>
223 <FONT color="green">220</FONT> }<a name="line.220"></a>
224 <FONT color="green">221</FONT> }<a name="line.221"></a>
225 <FONT color="green">222</FONT> <a name="line.222"></a>
226 <FONT color="green">223</FONT> return new PolynomialFunction(newCoefficients);<a name="line.223"></a>
227 <FONT color="green">224</FONT> <a name="line.224"></a>
228 <FONT color="green">225</FONT> }<a name="line.225"></a>
229 <FONT color="green">226</FONT> <a name="line.226"></a>
230 <FONT color="green">227</FONT> /**<a name="line.227"></a>
231 <FONT color="green">228</FONT> * Returns the coefficients of the derivative of the polynomial with the given coefficients.<a name="line.228"></a>
232 <FONT color="green">229</FONT> *<a name="line.229"></a>
233 <FONT color="green">230</FONT> * @param coefficients the coefficients of the polynomial to differentiate<a name="line.230"></a>
234 <FONT color="green">231</FONT> * @return the coefficients of the derivative or null if coefficients has length 1.<a name="line.231"></a>
235 <FONT color="green">232</FONT> * @throws IllegalArgumentException if coefficients is empty<a name="line.232"></a>
236 <FONT color="green">233</FONT> * @throws NullPointerException if coefficients is null<a name="line.233"></a>
237 <FONT color="green">234</FONT> */<a name="line.234"></a>
238 <FONT color="green">235</FONT> protected static double[] differentiate(double[] coefficients) {<a name="line.235"></a>
239 <FONT color="green">236</FONT> int n = coefficients.length;<a name="line.236"></a>
240 <FONT color="green">237</FONT> if (n &lt; 1) {<a name="line.237"></a>
241 <FONT color="green">238</FONT> throw MathRuntimeException.createIllegalArgumentException(EMPTY_ARRAY_MESSAGE);<a name="line.238"></a>
242 <FONT color="green">239</FONT> }<a name="line.239"></a>
243 <FONT color="green">240</FONT> if (n == 1) {<a name="line.240"></a>
244 <FONT color="green">241</FONT> return new double[]{0};<a name="line.241"></a>
245 <FONT color="green">242</FONT> }<a name="line.242"></a>
246 <FONT color="green">243</FONT> double[] result = new double[n - 1];<a name="line.243"></a>
247 <FONT color="green">244</FONT> for (int i = n - 1; i &gt; 0; i--) {<a name="line.244"></a>
248 <FONT color="green">245</FONT> result[i - 1] = i * coefficients[i];<a name="line.245"></a>
249 <FONT color="green">246</FONT> }<a name="line.246"></a>
250 <FONT color="green">247</FONT> return result;<a name="line.247"></a>
251 <FONT color="green">248</FONT> }<a name="line.248"></a>
252 <FONT color="green">249</FONT> <a name="line.249"></a>
253 <FONT color="green">250</FONT> /**<a name="line.250"></a>
254 <FONT color="green">251</FONT> * Returns the derivative as a PolynomialRealFunction<a name="line.251"></a>
255 <FONT color="green">252</FONT> *<a name="line.252"></a>
256 <FONT color="green">253</FONT> * @return the derivative polynomial<a name="line.253"></a>
257 <FONT color="green">254</FONT> */<a name="line.254"></a>
258 <FONT color="green">255</FONT> public PolynomialFunction polynomialDerivative() {<a name="line.255"></a>
259 <FONT color="green">256</FONT> return new PolynomialFunction(differentiate(coefficients));<a name="line.256"></a>
260 <FONT color="green">257</FONT> }<a name="line.257"></a>
261 <FONT color="green">258</FONT> <a name="line.258"></a>
262 <FONT color="green">259</FONT> /**<a name="line.259"></a>
263 <FONT color="green">260</FONT> * Returns the derivative as a UnivariateRealFunction<a name="line.260"></a>
264 <FONT color="green">261</FONT> *<a name="line.261"></a>
265 <FONT color="green">262</FONT> * @return the derivative function<a name="line.262"></a>
266 <FONT color="green">263</FONT> */<a name="line.263"></a>
267 <FONT color="green">264</FONT> public UnivariateRealFunction derivative() {<a name="line.264"></a>
268 <FONT color="green">265</FONT> return polynomialDerivative();<a name="line.265"></a>
269 <FONT color="green">266</FONT> }<a name="line.266"></a>
270 <FONT color="green">267</FONT> <a name="line.267"></a>
271 <FONT color="green">268</FONT> /** Returns a string representation of the polynomial.<a name="line.268"></a>
272 <FONT color="green">269</FONT> <a name="line.269"></a>
273 <FONT color="green">270</FONT> * &lt;p&gt;The representation is user oriented. Terms are displayed lowest<a name="line.270"></a>
274 <FONT color="green">271</FONT> * degrees first. The multiplications signs, coefficients equals to<a name="line.271"></a>
275 <FONT color="green">272</FONT> * one and null terms are not displayed (except if the polynomial is 0,<a name="line.272"></a>
276 <FONT color="green">273</FONT> * in which case the 0 constant term is displayed). Addition of terms<a name="line.273"></a>
277 <FONT color="green">274</FONT> * with negative coefficients are replaced by subtraction of terms<a name="line.274"></a>
278 <FONT color="green">275</FONT> * with positive coefficients except for the first displayed term<a name="line.275"></a>
279 <FONT color="green">276</FONT> * (i.e. we display &lt;code&gt;-3&lt;/code&gt; for a constant negative polynomial,<a name="line.276"></a>
280 <FONT color="green">277</FONT> * but &lt;code&gt;1 - 3 x + x^2&lt;/code&gt; if the negative coefficient is not<a name="line.277"></a>
281 <FONT color="green">278</FONT> * the first one displayed).&lt;/p&gt;<a name="line.278"></a>
282 <FONT color="green">279</FONT> <a name="line.279"></a>
283 <FONT color="green">280</FONT> * @return a string representation of the polynomial<a name="line.280"></a>
284 <FONT color="green">281</FONT> <a name="line.281"></a>
285 <FONT color="green">282</FONT> */<a name="line.282"></a>
286 <FONT color="green">283</FONT> @Override<a name="line.283"></a>
287 <FONT color="green">284</FONT> public String toString() {<a name="line.284"></a>
288 <FONT color="green">285</FONT> <a name="line.285"></a>
289 <FONT color="green">286</FONT> StringBuffer s = new StringBuffer();<a name="line.286"></a>
290 <FONT color="green">287</FONT> if (coefficients[0] == 0.0) {<a name="line.287"></a>
291 <FONT color="green">288</FONT> if (coefficients.length == 1) {<a name="line.288"></a>
292 <FONT color="green">289</FONT> return "0";<a name="line.289"></a>
293 <FONT color="green">290</FONT> }<a name="line.290"></a>
294 <FONT color="green">291</FONT> } else {<a name="line.291"></a>
295 <FONT color="green">292</FONT> s.append(Double.toString(coefficients[0]));<a name="line.292"></a>
296 <FONT color="green">293</FONT> }<a name="line.293"></a>
297 <FONT color="green">294</FONT> <a name="line.294"></a>
298 <FONT color="green">295</FONT> for (int i = 1; i &lt; coefficients.length; ++i) {<a name="line.295"></a>
299 <FONT color="green">296</FONT> <a name="line.296"></a>
300 <FONT color="green">297</FONT> if (coefficients[i] != 0) {<a name="line.297"></a>
301 <FONT color="green">298</FONT> <a name="line.298"></a>
302 <FONT color="green">299</FONT> if (s.length() &gt; 0) {<a name="line.299"></a>
303 <FONT color="green">300</FONT> if (coefficients[i] &lt; 0) {<a name="line.300"></a>
304 <FONT color="green">301</FONT> s.append(" - ");<a name="line.301"></a>
305 <FONT color="green">302</FONT> } else {<a name="line.302"></a>
306 <FONT color="green">303</FONT> s.append(" + ");<a name="line.303"></a>
307 <FONT color="green">304</FONT> }<a name="line.304"></a>
308 <FONT color="green">305</FONT> } else {<a name="line.305"></a>
309 <FONT color="green">306</FONT> if (coefficients[i] &lt; 0) {<a name="line.306"></a>
310 <FONT color="green">307</FONT> s.append("-");<a name="line.307"></a>
311 <FONT color="green">308</FONT> }<a name="line.308"></a>
312 <FONT color="green">309</FONT> }<a name="line.309"></a>
313 <FONT color="green">310</FONT> <a name="line.310"></a>
314 <FONT color="green">311</FONT> double absAi = Math.abs(coefficients[i]);<a name="line.311"></a>
315 <FONT color="green">312</FONT> if ((absAi - 1) != 0) {<a name="line.312"></a>
316 <FONT color="green">313</FONT> s.append(Double.toString(absAi));<a name="line.313"></a>
317 <FONT color="green">314</FONT> s.append(' ');<a name="line.314"></a>
318 <FONT color="green">315</FONT> }<a name="line.315"></a>
319 <FONT color="green">316</FONT> <a name="line.316"></a>
320 <FONT color="green">317</FONT> s.append("x");<a name="line.317"></a>
321 <FONT color="green">318</FONT> if (i &gt; 1) {<a name="line.318"></a>
322 <FONT color="green">319</FONT> s.append('^');<a name="line.319"></a>
323 <FONT color="green">320</FONT> s.append(Integer.toString(i));<a name="line.320"></a>
324 <FONT color="green">321</FONT> }<a name="line.321"></a>
325 <FONT color="green">322</FONT> }<a name="line.322"></a>
326 <FONT color="green">323</FONT> <a name="line.323"></a>
327 <FONT color="green">324</FONT> }<a name="line.324"></a>
328 <FONT color="green">325</FONT> <a name="line.325"></a>
329 <FONT color="green">326</FONT> return s.toString();<a name="line.326"></a>
330 <FONT color="green">327</FONT> <a name="line.327"></a>
331 <FONT color="green">328</FONT> }<a name="line.328"></a>
332 <FONT color="green">329</FONT> <a name="line.329"></a>
333 <FONT color="green">330</FONT> /** {@inheritDoc} */<a name="line.330"></a>
334 <FONT color="green">331</FONT> @Override<a name="line.331"></a>
335 <FONT color="green">332</FONT> public int hashCode() {<a name="line.332"></a>
336 <FONT color="green">333</FONT> final int prime = 31;<a name="line.333"></a>
337 <FONT color="green">334</FONT> int result = 1;<a name="line.334"></a>
338 <FONT color="green">335</FONT> result = prime * result + Arrays.hashCode(coefficients);<a name="line.335"></a>
339 <FONT color="green">336</FONT> return result;<a name="line.336"></a>
340 <FONT color="green">337</FONT> }<a name="line.337"></a>
341 <FONT color="green">338</FONT> <a name="line.338"></a>
342 <FONT color="green">339</FONT> /** {@inheritDoc} */<a name="line.339"></a>
343 <FONT color="green">340</FONT> @Override<a name="line.340"></a>
344 <FONT color="green">341</FONT> public boolean equals(Object obj) {<a name="line.341"></a>
345 <FONT color="green">342</FONT> if (this == obj)<a name="line.342"></a>
346 <FONT color="green">343</FONT> return true;<a name="line.343"></a>
347 <FONT color="green">344</FONT> if (!(obj instanceof PolynomialFunction))<a name="line.344"></a>
348 <FONT color="green">345</FONT> return false;<a name="line.345"></a>
349 <FONT color="green">346</FONT> PolynomialFunction other = (PolynomialFunction) obj;<a name="line.346"></a>
350 <FONT color="green">347</FONT> if (!Arrays.equals(coefficients, other.coefficients))<a name="line.347"></a>
351 <FONT color="green">348</FONT> return false;<a name="line.348"></a>
352 <FONT color="green">349</FONT> return true;<a name="line.349"></a>
353 <FONT color="green">350</FONT> }<a name="line.350"></a>
354 <FONT color="green">351</FONT> <a name="line.351"></a>
355 <FONT color="green">352</FONT> }<a name="line.352"></a>
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416 </PRE>
417 </BODY>
418 </HTML>