001 /* 002 * Licensed to the Apache Software Foundation (ASF) under one or more 003 * contributor license agreements. See the NOTICE file distributed with 004 * this work for additional information regarding copyright ownership. 005 * The ASF licenses this file to You under the Apache License, Version 2.0 006 * (the "License"); you may not use this file except in compliance with 007 * the License. You may obtain a copy of the License at 008 * 009 * http://www.apache.org/licenses/LICENSE-2.0 010 * 011 * Unless required by applicable law or agreed to in writing, software 012 * distributed under the License is distributed on an "AS IS" BASIS, 013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 014 * See the License for the specific language governing permissions and 015 * limitations under the License. 016 */ 017 package org.apache.commons.math.analysis.polynomials; 018 019 import org.apache.commons.math.MathException; 020 import junit.framework.TestCase; 021 022 /** 023 * Testcase for Lagrange form of polynomial function. 024 * <p> 025 * We use n+1 points to interpolate a polynomial of degree n. This should 026 * give us the exact same polynomial as result. Thus we can use a very 027 * small tolerance to account only for round-off errors. 028 * 029 * @version $Revision: 799857 $ $Date: 2009-08-01 09:07:12 -0400 (Sat, 01 Aug 2009) $ 030 */ 031 public final class PolynomialFunctionLagrangeFormTest extends TestCase { 032 033 /** 034 * Test of polynomial for the linear function. 035 */ 036 public void testLinearFunction() throws MathException { 037 PolynomialFunctionLagrangeForm p; 038 double c[], z, expected, result, tolerance = 1E-12; 039 040 // p(x) = 1.5x - 4 041 double x[] = { 0.0, 3.0 }; 042 double y[] = { -4.0, 0.5 }; 043 p = new PolynomialFunctionLagrangeForm(x, y); 044 045 z = 2.0; expected = -1.0; result = p.value(z); 046 assertEquals(expected, result, tolerance); 047 048 z = 4.5; expected = 2.75; result = p.value(z); 049 assertEquals(expected, result, tolerance); 050 051 z = 6.0; expected = 5.0; result = p.value(z); 052 assertEquals(expected, result, tolerance); 053 054 assertEquals(1, p.degree()); 055 056 c = p.getCoefficients(); 057 assertEquals(2, c.length); 058 assertEquals(-4.0, c[0], tolerance); 059 assertEquals(1.5, c[1], tolerance); 060 } 061 062 /** 063 * Test of polynomial for the quadratic function. 064 */ 065 public void testQuadraticFunction() throws MathException { 066 PolynomialFunctionLagrangeForm p; 067 double c[], z, expected, result, tolerance = 1E-12; 068 069 // p(x) = 2x^2 + 5x - 3 = (2x - 1)(x + 3) 070 double x[] = { 0.0, -1.0, 0.5 }; 071 double y[] = { -3.0, -6.0, 0.0 }; 072 p = new PolynomialFunctionLagrangeForm(x, y); 073 074 z = 1.0; expected = 4.0; result = p.value(z); 075 assertEquals(expected, result, tolerance); 076 077 z = 2.5; expected = 22.0; result = p.value(z); 078 assertEquals(expected, result, tolerance); 079 080 z = -2.0; expected = -5.0; result = p.value(z); 081 assertEquals(expected, result, tolerance); 082 083 assertEquals(2, p.degree()); 084 085 c = p.getCoefficients(); 086 assertEquals(3, c.length); 087 assertEquals(-3.0, c[0], tolerance); 088 assertEquals(5.0, c[1], tolerance); 089 assertEquals(2.0, c[2], tolerance); 090 } 091 092 /** 093 * Test of polynomial for the quintic function. 094 */ 095 public void testQuinticFunction() throws MathException { 096 PolynomialFunctionLagrangeForm p; 097 double c[], z, expected, result, tolerance = 1E-12; 098 099 // p(x) = x^5 - x^4 - 7x^3 + x^2 + 6x = x(x^2 - 1)(x + 2)(x - 3) 100 double x[] = { 1.0, -1.0, 2.0, 3.0, -3.0, 0.5 }; 101 double y[] = { 0.0, 0.0, -24.0, 0.0, -144.0, 2.34375 }; 102 p = new PolynomialFunctionLagrangeForm(x, y); 103 104 z = 0.0; expected = 0.0; result = p.value(z); 105 assertEquals(expected, result, tolerance); 106 107 z = -2.0; expected = 0.0; result = p.value(z); 108 assertEquals(expected, result, tolerance); 109 110 z = 4.0; expected = 360.0; result = p.value(z); 111 assertEquals(expected, result, tolerance); 112 113 assertEquals(5, p.degree()); 114 115 c = p.getCoefficients(); 116 assertEquals(6, c.length); 117 assertEquals(0.0, c[0], tolerance); 118 assertEquals(6.0, c[1], tolerance); 119 assertEquals(1.0, c[2], tolerance); 120 assertEquals(-7.0, c[3], tolerance); 121 assertEquals(-1.0, c[4], tolerance); 122 assertEquals(1.0, c[5], tolerance); 123 } 124 125 /** 126 * Test of parameters for the polynomial. 127 */ 128 public void testParameters() throws Exception { 129 130 try { 131 // bad input array length 132 double x[] = { 1.0 }; 133 double y[] = { 2.0 }; 134 new PolynomialFunctionLagrangeForm(x, y); 135 fail("Expecting IllegalArgumentException - bad input array length"); 136 } catch (IllegalArgumentException ex) { 137 // expected 138 } 139 try { 140 // mismatch input arrays 141 double x[] = { 1.0, 2.0, 3.0, 4.0 }; 142 double y[] = { 0.0, -4.0, -24.0 }; 143 new PolynomialFunctionLagrangeForm(x, y); 144 fail("Expecting IllegalArgumentException - mismatch input arrays"); 145 } catch (IllegalArgumentException ex) { 146 // expected 147 } 148 } 149 }