Author: luc Date: Tue Apr 15 06:17:43 2008 New Revision: 648235 URL: http://svn.apache.org/viewvc?rev=648235&view=rev Log: created fallback finite differences implementation for differentiation
Added: commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/differences/ commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/differences/EightPointsScheme.java (with props) commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/differences/FiniteDifferencesDifferentiator.java (with props) commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/differences/FourPointsScheme.java (with props) commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/differences/SixPointsScheme.java (with props) commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/differences/TwoPointsScheme.java (with props) Added: commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/differences/EightPointsScheme.java URL: http://svn.apache.org/viewvc/commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/differences/EightPointsScheme.java?rev=648235&view=auto ============================================================================== --- commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/differences/EightPointsScheme.java (added) +++ commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/differences/EightPointsScheme.java Tue Apr 15 06:17:43 2008 @@ -0,0 +1,62 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.commons.nabla.differences; + +import org.apache.commons.nabla.core.DifferentialPair; +import org.apache.commons.nabla.core.UnivariateDerivative; +import org.apache.commons.nabla.core.UnivariateDifferentiable; + +/** Eight-points finite differences scheme. + * The error model for the eight-points scheme is + * <code>-h<sup>8</sup>/630 f<sup>(9)</sup>(x) + O(h<sup>10</sup>)</code>. + */ +public class EightPointsScheme extends FiniteDifferencesDifferentiator { + + /** Serializable UID. */ + private static final long serialVersionUID = 39061646369246780L; + + /** Scheme denominator. */ + private final double denominator; + + /** Build an 8-points finite differences scheme. + * @param h differences step size + */ + public EightPointsScheme(final double h) { + super(h, -h * h * h * h * h * h * h * h / 630); + denominator = 840 * h; + } + + /** [EMAIL PROTECTED] */ + public UnivariateDerivative differentiate(final UnivariateDifferentiable d) { + return new UnivariateDerivative() { + public UnivariateDifferentiable getPrimitive() { + return d; + } + public DifferentialPair f(final DifferentialPair t) { + final double h = getStepSize(); + final double u0 = t.getU0(); + final double ft = d.f(u0); + final double d1 = d.f(u0 + h) - d.f(u0 - h); + final double d2 = d.f(u0 + 2 * h) - d.f(u0 - 2 * h); + final double d3 = d.f(u0 + 3 * h) - d.f(u0 - 3 * h); + final double d4 = d.f(u0 + 4 * h) - d.f(u0 - 4 * h); + return new DifferentialPair(ft, t.getU1() * (-3 * d4 + 32 * d3 - 168 * d2 + 672 * d1) / denominator); + } + }; + } + +} Propchange: commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/differences/EightPointsScheme.java ------------------------------------------------------------------------------ svn:eol-style = native Added: commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/differences/FiniteDifferencesDifferentiator.java URL: http://svn.apache.org/viewvc/commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/differences/FiniteDifferencesDifferentiator.java?rev=648235&view=auto ============================================================================== --- commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/differences/FiniteDifferencesDifferentiator.java (added) +++ commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/differences/FiniteDifferencesDifferentiator.java Tue Apr 15 06:17:43 2008 @@ -0,0 +1,77 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.commons.nabla.differences; + +import java.io.Serializable; + +import org.apache.commons.nabla.core.UnivariateDifferentiator; + +/** This class represents a differentiation scheme based on finite differences. + * <p>The differences are based on regularly distributed points around the + * central test point according to a given h step. + * For example a four points scheme would use a linear combination of points + * <code>f(x-2h)</code>, <code>f(x-h)</code>, <code>f(x+h)</code> and + * <code>f(x+2h)</code> to compute the first differential <code>f'(x)</code> + * (note that <code>f(x)</code> by itself is not used). + * The computed differential is only an approximation, the error depends on + * the value of the high order differentials of the function which were not + * canceled by the linear combination, the number of points and the step. + * For example the four points scheme cancels the + * <code>f<sup>(2)</sup></code>, <code>f<sup>(3)</sup></code> and + * <code>f<sup>(4)</sup></code> high order differentials but not the + * <code>f<sup>(5)</sup></code> and higher order terms. The error model is + * <code>-2h<sup>4</sup>/5 f<sup>(5)</sup>(x) + O(h<sup>6</sup>)</code>. + * </p> + */ +public abstract class FiniteDifferencesDifferentiator + implements UnivariateDifferentiator, Serializable { + + /** Step size. */ + private final double stepSize; + + /** Error scale factor. */ + private final double factor; + + /** Simple constructor. + * @param stepSize step stepSize + * @param factor error scale factor + */ + protected FiniteDifferencesDifferentiator(final double stepSize, final double factor) { + this.stepSize = stepSize; + this.factor = factor; + } + + /** Get the signed error scale factor for the finite differences scheme. + * <p>The error scale factor is the value of the h-dependent + * factor of the first non-canceled high order differential of the function. + * For example since the error model for the four points scheme is + * <code>-2h<sup>4</sup>/5 f<sup>(5)</sup>(x) + O(h<sup>6</sup>)</code>, + * the signed error scale factor is <code>-2h<sup>4</sup>/5</code>.</p> + * @return error signed scale factor + */ + public double getSignedErrorScaleFactor() { + return factor; + } + + /** Get the step size. + * @return step size + */ + protected double getStepSize() { + return stepSize; + } + +} Propchange: commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/differences/FiniteDifferencesDifferentiator.java ------------------------------------------------------------------------------ svn:eol-style = native Added: commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/differences/FourPointsScheme.java URL: http://svn.apache.org/viewvc/commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/differences/FourPointsScheme.java?rev=648235&view=auto ============================================================================== --- commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/differences/FourPointsScheme.java (added) +++ commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/differences/FourPointsScheme.java Tue Apr 15 06:17:43 2008 @@ -0,0 +1,60 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.commons.nabla.differences; + +import org.apache.commons.nabla.core.DifferentialPair; +import org.apache.commons.nabla.core.UnivariateDerivative; +import org.apache.commons.nabla.core.UnivariateDifferentiable; + +/** Four-points finite differences scheme. + * The error model for the four-points scheme is + * <code>-2h<sup>4</sup>/5 f<sup>(5)</sup>(x) + O(h<sup>6</sup>)</code>. + */ +public class FourPointsScheme extends FiniteDifferencesDifferentiator { + + /** Serializable UID. */ + private static final long serialVersionUID = -4303710033273686431L; + + /** Scheme denominator. */ + private final double denominator; + + /** Build a 4-points finite differences scheme. + * @param h differences step size + */ + public FourPointsScheme(final double h) { + super(h, -2 * h * h * h * h / 5); + denominator = 12 * h; + } + + /** [EMAIL PROTECTED] */ + public UnivariateDerivative differentiate(final UnivariateDifferentiable d) { + return new UnivariateDerivative() { + public UnivariateDifferentiable getPrimitive() { + return d; + } + public DifferentialPair f(final DifferentialPair t) { + final double h = getStepSize(); + final double u0 = t.getU0(); + final double ft = d.f(u0); + final double d1 = d.f(u0 + h) - d.f(u0 - h); + final double d2 = d.f(u0 + 2 * h) - d.f(u0 - 2 * h); + return new DifferentialPair(ft, t.getU1() * (8 * d1 - d2) / denominator); + } + }; + } + +} Propchange: commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/differences/FourPointsScheme.java ------------------------------------------------------------------------------ svn:eol-style = native Added: commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/differences/SixPointsScheme.java URL: http://svn.apache.org/viewvc/commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/differences/SixPointsScheme.java?rev=648235&view=auto ============================================================================== --- commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/differences/SixPointsScheme.java (added) +++ commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/differences/SixPointsScheme.java Tue Apr 15 06:17:43 2008 @@ -0,0 +1,61 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.commons.nabla.differences; + +import org.apache.commons.nabla.core.DifferentialPair; +import org.apache.commons.nabla.core.UnivariateDerivative; +import org.apache.commons.nabla.core.UnivariateDifferentiable; + +/** Six-points finite differences scheme. + * The error model for the six-points scheme is + * <code>h<sup>6</sup>/140 f<sup>(7)</sup>(x) + O(h<sup>8</sup>)</code>. + */ +public class SixPointsScheme extends FiniteDifferencesDifferentiator { + + /** Serializable UID. */ + private static final long serialVersionUID = -3054982833938680212L; + + /** Scheme denominator. */ + private final double denominator; + + /** Build a 6-points finite differences scheme. + * @param h differences step size + */ + public SixPointsScheme(final double h) { + super(h, h * h * h * h * h * h / 140); + denominator = 60 * h; + } + + /** [EMAIL PROTECTED] */ + public UnivariateDerivative differentiate(final UnivariateDifferentiable d) { + return new UnivariateDerivative() { + public UnivariateDifferentiable getPrimitive() { + return d; + } + public DifferentialPair f(final DifferentialPair t) { + final double h = getStepSize(); + final double u0 = t.getU0(); + final double ft = d.f(u0); + final double d1 = d.f(u0 + h) - d.f(u0 - h); + final double d2 = d.f(u0 + 2 * h) - d.f(u0 - 2 * h); + final double d3 = d.f(u0 + 3 * h) - d.f(u0 - 3 * h); + return new DifferentialPair(ft, t.getU1() * (d3 - 9 * d2 + 45 * d1) / denominator); + } + }; + } + +} Propchange: commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/differences/SixPointsScheme.java ------------------------------------------------------------------------------ svn:eol-style = native Added: commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/differences/TwoPointsScheme.java URL: http://svn.apache.org/viewvc/commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/differences/TwoPointsScheme.java?rev=648235&view=auto ============================================================================== --- commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/differences/TwoPointsScheme.java (added) +++ commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/differences/TwoPointsScheme.java Tue Apr 15 06:17:43 2008 @@ -0,0 +1,59 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.commons.nabla.differences; + +import org.apache.commons.nabla.core.DifferentialPair; +import org.apache.commons.nabla.core.UnivariateDerivative; +import org.apache.commons.nabla.core.UnivariateDifferentiable; + +/** Two-points finite differences scheme. + * The error model for the two-points scheme is + * <code>h<sup>2</sup>/6 f<sup>(3)</sup>(x) + O(h<sup>4</sup>)</code>. + */ +public class TwoPointsScheme extends FiniteDifferencesDifferentiator { + + /** Serializable UID. */ + private static final long serialVersionUID = -3932881915416655202L; + + /** Scheme denominator. */ + private final double denominator; + + /** Build a 2-points finite differences scheme. + * @param h differences step size + */ + public TwoPointsScheme(final double h) { + super(h, h * h / 6); + denominator = 2 * h; + } + + /** [EMAIL PROTECTED] */ + public UnivariateDerivative differentiate(final UnivariateDifferentiable d) { + return new UnivariateDerivative() { + public UnivariateDifferentiable getPrimitive() { + return d; + } + public DifferentialPair f(final DifferentialPair t) { + final double h = getStepSize(); + final double u0 = t.getU0(); + final double ft = d.f(u0); + final double d1 = d.f(u0 + h) - d.f(u0 - h); + return new DifferentialPair(ft, t.getU1() * d1 / denominator); + } + }; + } + +} Propchange: commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/differences/TwoPointsScheme.java ------------------------------------------------------------------------------ svn:eol-style = native