|
[ 簡単な説明 ] 微積分ライブラリの使用例です。 |
| プログラム・ソース 1 ("test3.c") |
----- 出力例 1 | :lagdif( ),spldif( ) |
| プログラム・ソース 2 ("test4.c") |
----- 出力例 2 | :trap( ),simpei( ),simpui( ),splitg( ),cheb3( )〜cheb6( ),dgl3( )〜dgl48( ) |
| プログラム・ソース 3 ("test5.c") |
----- 出力例 3 | :dglg3( )〜dglg10( ) |
| プログラム・ソース 4 ("test6.c") |
----- 出力例 4 | :dgh10( ),dgh15( ) |
| プログラム・ソース 5 ("test7.c") |
----- 出力例 5 | :simpe2( ) |
| プログラム・ソース 6 ("test8.c") |
----- 出力例 6 | :nc1( )〜nc8( ),weddle( ),hardy( ),lomberg( ) |
| プログラム・ソース 7 ("test9.c") |
----- 出力例 7 | :difm1( )〜difm8( ),difb2( )〜difb5( ),diff2( )〜diff5( ) |
/* test3.c */
#include <stdio.h>
#include "sslib.h"
double _f(double x){return x;}
int main(void)
{
int i, n;
double diff, x[20], y[20], xx;
n = 11;
xx = 0.5;
for(i = 0; i < n; i++)
{
x[i] = M_PI / (double)n * (double)i;
y[i] = sin(x[i]);
}
printf("* Difference by lagdif\n");
printf(" Difference = %22.15e x = %5.1f\n",
(diff = lagdif(x, y, n, xx)), xx);
printf(" Exact value = %22.15e\n", cos(xx));
printf(" Error = %e\n", diff - cos(xx));
printf("* Difference by spldif\n");
printf(" Difference = %22.15e x = %5.1f\n",
(diff = spldif(x, y, n, xx)), xx);
printf(" Exact value = %22.15e\n", cos(xx));
printf(" Error = %e\n", diff - cos(xx));
return 1;
}
|
* Difference by lagdif Difference = 8.775825640935108e-01 x = 0.5 Exact value = 8.775825618903728e-01 Error = 2.203138e-09 * Difference by spldif Difference = 8.776641556411690e-01 x = 0.5 Exact value = 8.775825618903728e-01 Error = 8.159375e-05 |
/* test4.c */
#include <stdio.h>
#include "sslib.h"
/* should be defind by user as _f(x) for cheb3(), cheb4(), chev6()
for dgl3(), dgl10(), dgl20(), dgl32(), dgl48() */
double _f(double x)
{
return exp(x);
}
int main(void)
{
int i, n;
double x[100], y[100], a, b, exa, h, *p, *q, s;
n = 100;
for(i = 0, p = x, q = y; i < n; i++, p++, q++)
{
*p = (double)i / (double)(n - 1);
*q = exp(*p);
}
s = trap(x, y, n);
exa = exp(1.) - 1.;
printf("* Integral by Trapezoid's rule\n");
printf(" exp(x) x = 0 --> 1 (devided point %d)\n", n);
printf(" Integration = %22.15e\n", s);
printf(" Exact = %22.15e\n", exa);
printf(" Error = %12.5e\n", s - exa);
n = 21;
h = M_PI / (double)(n - 1);
for(i = 0, p = y; i < n; i++, p++) *p = sin(h * (double)i);
s = simpei(y, n, h);
exa = 2.;
printf("* Integral by Simpson's method\n");
printf(" exp(x) x = 0 --> 1 (devided point %d)\n", n);
printf(" Integration = %22.15e\n", s);
printf(" Exact = %22.15e\n", exa);
printf(" Error = %12.5e\n", s - exa);
n = 21;
h = M_PI / (double)(n - 1);
for(i = 0, p = x, q = y; i < n; i++, p++, q++)
{
*p = h * (double)i;
if ((i != 0) && (i != n - 1)) *p += .005 * (double)i;
*q = sin(*p);
}
s = simpui(x, y, n);
exa = 2.;
printf("* Integral by Simpson's method (unequal interval)\n");
printf(" exp(x) x = 0 --> 1 (devided point %d)\n", n);
printf(" Integration = %22.15e\n", s);
printf(" Exact = %22.15e\n", exa);
printf(" Error = %12.5e\n", s - exa);
n = 21;
h = M_PI / (double)(n - 1);
for(i = 0, p = x, q = y; i < n; i++, p++, q++)
{
*p = h * (double)i;
*q = sin(*p);
}
s = splitg(x, y, n);
exa = 2.;
printf("* Integral by Cubic Spline Function's rule\n");
printf(" exp(x) x = 0 --> 1 (devided point %d)\n", n);
printf(" Integration = %22.15e\n", s);
printf(" Exact = %22.15e\n", exa);
printf(" Error = %12.5e\n", s - exa);
a = 0.;
b = 1.;
printf("* Integration by Chebyshev's method\n");
printf(" exp(x) x=%4.1f --> %4.1f\n", a, b);
exa = exp(1.) - 1.;
s = cheb3(a, b);
printf("* 3 - point\n");
printf(" Integration = %22.15e\n", s);
printf(" Exact = %22.15e\n", exa);
printf(" Error = %12.5e\n", s - exa);
s = cheb4(a, b);
printf("* 4 - point\n");
printf(" Integration = %22.15e\n", s);
printf(" Exact = %22.15e\n", exa);
printf(" Error = %12.5e\n", s - exa);
s = cheb6(a, b);
printf("* 6 - point\n");
printf(" Integration = %22.15e\n", s);
printf(" Exact = %22.15e\n", exa);
printf(" Error = %12.5e\n", s - exa);
a = 0.;
b = 1.;
printf("* Integration by Gauss-Legendre's method\n");
printf(" exp(x) x=%4.1f --> %4.1f\n", a, b);
exa = exp(1.) - 1.;
s = dgl3(a, b);
printf("* 3 - point\n");
printf(" Integration = %22.15e\n", s);
printf(" Exact = %22.15e\n", exa);
printf(" Error = %12.5e\n", s - exa);
s = dgl10(a, b);
printf("* 10 - point\n");
printf(" Integration = %22.15e\n", s);
printf(" Exact = %22.15e\n", exa);
printf(" Error = %12.5e\n", s - exa);
s = dgl20(a, b);
printf("* 20 - point\n");
printf(" Integration = %22.15e\n", s);
printf(" Exact = %22.15e\n", exa);
printf(" Error = %12.5e\n", s - exa);
s = dgl32(a, b);
printf("* 32 - point\n");
printf(" Integration = %22.15e\n", s);
printf(" Exact = %22.15e\n", exa);
printf(" Error = %12.5e\n", s - exa);
s = dgl48(a, b);
printf("* 48 - point\n");
printf(" Integration = %22.15e\n", s);
printf(" Exact = %22.15e\n", exa);
printf(" Error = %12.5e\n", s - exa);
return 1;
}
|
* Integral by Trapezoid's rule
exp(x) x = 0 --> 1 (devided point 100)
Integration = 1.718296438183448e+00
Exact = 1.718281828459045e+00
Error = 1.46097e-05
* Integral by Simpson's method
exp(x) x = 0 --> 1 (devided point 21)
Integration = 2.000006784441801e+00
Exact = 2.000000000000000e+00
Error = 6.78444e-06
* Integral by Simpson's method (unequal interval)
exp(x) x = 0 --> 1 (devided point 21)
Integration = 1.999992061966324e+00
Exact = 2.000000000000000e+00
Error = -7.93803e-06
* Integral by Cubic Spline Function's rule
exp(x) x = 0 --> 1 (devided point 21)
Integration = 2.000048923424123e+00
Exact = 2.000000000000000e+00
Error = 4.89234e-05
* Integration by Chebyshev's method
exp(x) x= 0.0 --> 1.0
* 3 - point
Integration = 1.718136569435059e+00
Exact = 1.718281828459045e+00
Error = -1.45259e-04
* 4 - point
Integration = 1.718281217601509e+00
Exact = 1.718281828459045e+00
Error = -6.10858e-07
* 6 - point
Integration = 1.718281827642581e+00
Exact = 1.718281828459045e+00
Error = -8.16464e-10
* Integration by Gauss-Legendre's method
exp(x) x= 0.0 --> 1.0
* 3 - point
Integration = 1.718281004372524e+00
Exact = 1.718281828459045e+00
Error = -8.24087e-07
* 10 - point
Integration = 1.718281828459045e+00
Exact = 1.718281828459045e+00
Error = -2.22045e-16
* 20 - point
Integration = 1.718281828459045e+00
Exact = 1.718281828459045e+00
Error = -2.22045e-16
* 32 - point
Integration = 1.718281828459045e+00
Exact = 1.718281828459045e+00
Error = -4.44089e-16
* 48 - point
Integration = 1.718281828459045e+00
Exact = 1.718281828459045e+00
Error = -4.44089e-16
|
/* test5.c */
#include <stdio.h>
#include "sslib.h"
/* should be defind by user as _f(x) for dglg3(), dglg5(), dglg10() */
double _f(double x){ return x;}
int main(void)
{
double exa, s;
exa = 1.;
printf("* Integral by Gauss-Laguerre's method\n");
printf(" f(x)*exp(-x) x = 0 --> ∞\n");
s = dglg3();
printf(" 3-point\n");
printf(" Integration = %22.15e\n", s);
printf(" Exact = %22.15e\n", exa);
printf(" Error = %12.5e\n", s - exa);
s = dglg5();
printf(" 5-point\n");
printf(" Integration = %22.15e\n", s);
printf(" Exact = %22.15e\n", exa);
printf(" Error = %12.5e\n", s - exa);
s = dglg10();
printf(" 10-point\n");
printf(" Integration = %22.15e\n", s);
printf(" Exact = %22.15e\n", exa);
printf(" Error = %12.5e\n", s - exa);
return 1;
}
|
* Integral by Gauss-Laguerre's method
f(x)*exp(-x) x = 0 --> ∞
3-point
Integration = 9.999999999999145e-01
Exact = 1.000000000000000e+00
Error = -8.54872e-14
5-point
Integration = 9.999999999999944e-01
Exact = 1.000000000000000e+00
Error = -5.55112e-15
10-point
Integration = 1.000000000000000e+00
Exact = 1.000000000000000e+00
Error = 0.00000e+00
|
/* test6.c */
#include <stdio.h>
#include "sslib.h"
/* should be defind by user as _f(x) for dgh10(), dgg15() */
double _f(double x){ return x * x;}
int main(void)
{
double exa, s;
exa = sqrt(M_PI) / 2.;
printf("* Integral by Gauss-Hermite's method\n");
printf(" f(x)*exp(-x*x) x = -∞ --> ∞\n");
s = dgh10();
printf(" 10-point\n");
printf(" Integration = %22.15e\n", s);
printf(" Exact = %22.15e\n", exa);
printf(" Error = %12.5e\n", s - exa);
s = dgh15();
printf(" 15-point\n");
printf(" Integration = %22.15e\n", s);
printf(" Exact = %22.15e\n", exa);
printf(" Error = %12.5e\n", s - exa);
return 1;
}
|
* Integral by Gauss-Hermite's method
f(x)*exp(-x*x) x = -∞ --> ∞
10-point
Integration = 8.862269254527584e-01
Exact = 8.862269254527579e-01
Error = 4.44089e-16
15-point
Integration = 8.862269254527527e-01
Exact = 8.862269254527579e-01
Error = -5.21805e-15
|
/* test7.c */
#include <stdio.h>
#include <stdlib.h>
#include "sslib.h"
int main(void)
{
double *y, exa, h1, h2, mn, s;
int i, ij, j, m, m1, n, n1;
m = 31;
n = 21;
m1 = m - 1;
n1 = n - 1;
mn = 1 / (double)(m1 * n1);
y = (double *)malloc(m * n * sizeof(double));
if(y == NULL)
{
fprintf(stderr, "Error : out of memory\n");
exit(-1);
}
for(i = ij = 0; i < m; i++)
for (j = 0; j < n; j++, ij++) y[ij] = mn * i * j;
h1 = 1. / (double)m1;
h2 = 1. / (double)n1;
exa = 0.25;
s = simpe2(y, m, n, h1, h2);
printf("* 2-Dimensional Integration of Simpson's method\n");
printf(" integral x * y (x : 0 - 1 , y : 0 - 1)");
printf(" (Divided point %d, %d)\n", m, n);
printf(" Result : %22.15e\n", s);
printf(" Exact : %22.15e\n", exa);
printf(" Error : %12.5e\n", s - exa);
return 1;
}
|
* 2-Dimensional Integration of Simpson's method
integral x * y (x : 0 - 1 , y : 0 - 1) (Divided point 31, 21)
Result : 2.500000000000000e-01
Exact : 2.500000000000000e-01
Error : 0.00000e+00
|
/* test8.c */
#include <stdio.h>
#include "sslib.h"
double _f(double x)
{
return sin(x);
}
int main(void)
{
double eps, xmin, xmax;
int n;
eps = 1.e-15;
xmin = 0.;
xmax = M_PI_2;
n = 100;
printf("Integration by NC_1 : %24.17e\n", nc1(xmin, xmax, n));
printf("Integration by NC_2 : %24.17e\n", nc2(xmin, xmax, n));
printf("Integration by NC_3 : %24.17e\n", nc3(xmin, xmax, n));
printf("Integration by NC_4 : %24.17e\n", nc4(xmin, xmax, n));
printf("Integration by NC_5 : %24.17e\n", nc5(xmin, xmax, n));
printf("Integration by NC_6 : %24.17e\n", nc6(xmin, xmax, n));
printf("Integration by NC_7 : %24.17e\n", nc7(xmin, xmax, n));
printf("Integration by NC_8 : %24.17e\n", nc8(xmin, xmax, n));
printf("Integration by Weddle : %24.17e\n", weddle(xmin, xmax, n));
printf("Integration by Hardy : %24.17e\n", hardy(xmin, xmax, n));
printf("Integration by Lomberg : %24.17e\n", lomberg(xmin, xmax, eps));
return 1;
}
|
Integration by NC_1 : 9.99979438239607554e-01 Integration by NC_2 : 1.00000000002113953e+00 Integration by NC_3 : 1.00000000000939515e+00 Integration by NC_4 : 9.99999999999999778e-01 Integration by NC_5 : 9.99999999999999889e-01 Integration by NC_6 : 1.00000000000000000e+00 Integration by NC_7 : 1.00000000000000000e+00 Integration by NC_8 : 1.00000000000000000e+00 Integration by Weddle : 1.00000000000000022e+00 Integration by Hardy : 1.00000000000000022e+00 Integration by Lomberg : 1.00000000000000022e+00 |
/* test9.c */
#include <stdio.h>
#include "sslib.h"
double _f(double x)
{
return sin(x);
}
int main(void)
{
double cosx, h, x, y;
x = M_PI * 0.0795;
h = 0.01;
cosx = cos(x);
y = diff2(x, h);
printf("diff2(x)=%e error=%e\n", y, y - cosx);
y = diff3(x, h);
printf("diff3(x)=%e error=%e\n", y, y - cosx);
y = diff4(x, h);
printf("diff4(x)=%e error=%e\n", y, y - cosx);
y = diff5(x, h);
printf("diff5(x)=%e error=%e\n", y, y - cosx);
y = difb2(x, h);
printf("difb2(x)=%e error=%e\n", y, y - cosx);
y = difb3(x, h);
printf("difb3(x)=%e error=%e\n", y, y - cosx);
y = difb4(x, h);
printf("difb4(x)=%e error=%e\n", y, y - cosx);
y = difb5(x, h);
printf("difb5(x)=%e error=%e\n", y, y - cosx);
y = difm1(x, h);
printf("difm1(x)=%e error=%e\n", y, y - cosx);
y = difm2(x, h);
printf("difm2(x)=%e error=%e\n", y, y - cosx);
y = difm3(x, h);
printf("difm3(x)=%e error=%e\n", y, y - cosx);
y = difm4(x, h);
printf("difm4(x)=%e error=%e\n", y, y - cosx);
y = difm5(x, h);
printf("difm5(x)=%e error=%e\n", y, y - cosx);
y = difm6(x, h);
printf("difm6(x)=%e error=%e\n", y, y - cosx);
y = difm7(x, h);
printf("difm7(x)=%e error=%e\n", y, y - cosx);
y = difm8(x, h);
printf("difm8(x)=%e error=%e\n", y, y - cosx);
return 1;
}
|
diff2(x)=9.690048e-01 error=3.223617e-05 diff3(x)=9.689727e-01 error=6.469370e-08 diff4(x)=9.689726e-01 error=-1.929405e-09 diff5(x)=9.689726e-01 error=-4.458767e-12 difb2(x)=9.690050e-01 error=3.235975e-05 difb3(x)=9.689725e-01 error=-5.888007e-08 difb4(x)=9.689726e-01 error=-1.945878e-09 difb5(x)=9.689726e-01 error=3.780198e-12 difm1(x)=9.689565e-01 error=-1.614946e-05 difm2(x)=9.689726e-01 error=-3.229861e-10 difm3(x)=9.689726e-01 error=-5.884182e-15 difm4(x)=9.689726e-01 error=1.110223e-15 difm5(x)=9.689726e-01 error=1.110223e-15 difm6(x)=9.689726e-01 error=1.221245e-15 difm7(x)=9.689726e-01 error=1.221245e-15 difm8(x)=9.689726e-01 error=1.332268e-15 |