Numerical integration: Difference between revisions

(→‎{{header|Ada}}: Fixed incorrect integration. Split up package specification and body. Added a test driver.)
Line 1,145:
 
=={{header|Java}}==
<lang java5>class NumericalIntegration
{{incorrect|Java|rightRect stops one h too soon; midRect does not sample midpoints but reimplements trapezium differently; trapezium is incorrect, doesn't multiply middle terms by 2 to account for double usage.}}
{
The function in this example is assumed to be <tt>f(double x)</tt>.
<lang java5>public class Integrate{
public static double leftRect(double a, double b, double n){
double h = (b - a) / n;
double sum = 0;
for(double x = a;x <= b - h;x += h)
sum += f(x);
return h * sum;
}
 
interface FPFunction
public static double rightRect(double a, double b, double n){
{
double h = (b - a) / n;
double eval(double sum = 0n);
}
for(double x = a + h;x <= b - h;x += h)
sum += f(x);
public static double rectangularLeft(double a, double b, int n, FPFunction f)
return h * sum;
}{
return rectangular(a, b, n, f, 0);
 
}
public static double midRect(double a, double b, double n){
double h = (b - a) / n;
public static double rectangularMidpoint(double a, double b, int n, FPFunction f)
double sum = 0;
{
for(double x = a;x <= b - h;x += h)
return rectangular(a, b, n, sum += (f(x) + f(x +, h)1);
}
return (h / 2) * sum;
}
public static double rectangularRight(double a, double b, int n, FPFunction f)
 
{
public static double trap(double a, double b, double n){
return rectangular(a, doubleb, hn, =f, (b - a2) / n;
}
double sum = f(a) + f(b);
for(int i = 1;i < n;i++)
public static double trapezium(double a, double b, int n, FPFunction f)
sum += f(a + i * h);
{
return h * sum;
double range = checkParamsGetRange(a, b, n);
}
double nFloat = (double)n;
 
public static double simpson(doublesum a, double b, double= n){0.0;
for (int double hi = (b1; -i a) /< n; i++)
{
double sum1 = 0;
double sum2x = 0a + range * (double)i / nFloat;
sum += f.eval(x);
 
}
for(int i = 0;i < n;i++)
sum1sum += (f.eval(a) + h * i + hf.eval(b)) / 2).0;
return sum * range / nFloat;
 
}
for(int i = 1;i < n;i++)
sum2 += f(a + h * i);
public static double simpsons(double a, double b, int n, FPFunction f)
 
{
return h / 6 * (f(a) + f(b) + 4 * sum1 + 2 * sum2);
double range = checkParamsGetRange(a, b, n);
}
//assume f(double x)nFloat elsewhere= in the class(double)n;
double sum1 = f.eval(a + range / (nFloat * 2.0));
}</lang>
double sum2 = 0.0;
for (int i = 1; i < n; i++)
{
double x1 = a + range * ((double)i + 0.5) / nFloat;
sum1 += f.eval(x1);
double x2 = a + range * (double)i / nFloat;
sum2 += f.eval(x2);
}
return (f.eval(a) + f.eval(b) + sum1 * 4.0 + sum2 * 2.0) * range / (nFloat * 6.0);
}
private static double rectangular(double a, double b, int n, FPFunction f, int mode)
{
double range = checkParamsGetRange(a, b, n);
double modeOffset = (double)mode / 2.0;
double nFloat = (double)n;
double sum = 0.0;
for (int i = 0; i < n; i++)
{
double x = a + range * ((double)i + modeOffset) / nFloat;
sum += f.eval(x);
}
return sum * range / nFloat;
}
private static double checkParamsGetRange(double a, double b, int n)
{
if (n <= 0)
throw new IllegalArgumentException("Invalid value of n");
double range = b - a;
if (range <= 0)
throw new IllegalArgumentException("Invalid range");
return range;
}
private static void testFunction(String fname, double a, double b, int n, FPFunction f)
{
System.out.println("Testing function \"" + fname + "\", a=" + a + ", b=" + b + ", n=" + n);
System.out.println("rectangularLeft: " + rectangularLeft(a, b, n, f));
System.out.println("rectangularMidpoint: " + rectangularMidpoint(a, b, n, f));
System.out.println("rectangularRight: " + rectangularRight(a, b, n, f));
System.out.println("trapezium: " + trapezium(a, b, n, f));
System.out.println("simpsons: " + simpsons(a, b, n, f));
System.out.println();
return;
}
public static void main(String[] args)
{
testFunction("x^3", 0.0, 1.0, 100, new FPFunction() {
public double eval(double n) {
return n * n * n;
}
}
);
testFunction("1/x", 1.0, 100.0, 1000, new FPFunction() {
public double eval(double n) {
return 1.0 / n;
}
}
);
testFunction("x", 0.0, 5000.0, 5000000, new FPFunction() {
public double eval(double n) {
return n;
}
}
);
testFunction("x", 0.0, 6000.0, 6000000, new FPFunction() {
public double eval(double n) {
return n;
}
}
);
return;
}
}
</lang>
 
=={{header|Logo}}==