Subversion Repositories programming

Rev

Rev 169 | Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
168 ira 1
/* Copyright: Ira W. Snyder
2
 * Start Date: 2005-11-28
3
 * End Date:
4
 * License: Public Domain
5
 *
6
 * Changelog Follows:
7
 * 2005-11-28
8
 * - Implement eval_euler() and eval_trapezoid().
9
 *
10
 * 2005-11-29
11
 * - Implement eval_romberg()
12
 *
13
 */
14
 
15
#include <cmath>
16
#include <cstdlib>
17
#include <cstdio>
18
#include <iostream>
19
using namespace std;
20
 
21
static const float a = 0.0;
22
static const float b = 3.0;
23
 
24
float f (float x)
25
{
26
    return 1.0 + pow (x, 28);
27
}
28
 
29
float eval_euler (const int n)
30
{
31
    const float h = (b - a) / n;
32
    float answer = 0.0, xi = 0.0;
33
    int i = 0;
34
 
35
    for (i=0; i<=n; i++)
36
    {
37
        xi = a + (i * h);
38
        answer += f(xi);
39
    }
40
 
41
    return h * answer;
42
}
43
 
44
float eval_trapezoid (const int n)
45
{
46
    const float h = (b - a) / n;
47
    float answer = 0.0, xi_last = 0.0, xi_now = 0.0;
48
    int i = 0;
49
 
50
    xi_last = a + (i * h); // i = 0 here
51
 
52
    for (i=1; i<=n; i++)
53
    {
54
        xi_now = a + (i * h);
55
        answer += (f (xi_last) + f (xi_now) * (xi_now - xi_last));
56
        xi_last = xi_now; // shift xi's
57
    }
58
 
59
    return answer;
60
}
61
 
62
float eval_romberg (const int n)
63
{
64
    float R[n+1][n+1];
65
    int i, j, k;
66
    float h, sum;
67
 
68
    h = b - a;
69
    R[0][0] = (h/2.0) * (f(a) + f(b));
70
 
71
    for (i=1; i<=n; i++)
72
    {
73
        h = h/2.0;
74
        sum = 0.0;
75
 
76
        for (k=1; k<=(pow(2.0, i) - 1); k+=2)
77
            sum = sum + f(a + k * h);
78
 
79
        R[i][0] = (1.0/2.0) * R[i-1][0] + sum * h;
80
 
81
        for (j=1; j<=i; j++)
82
            R[i][j] = R[i][j-1] + (R[i][j-1] - R[i-1][j-1]) / (pow(4.0, j) - 1);
83
    }
84
 
85
    return R[n][n];
86
}
87
 
88
float eval_simpson (const int n)
89
{
90
 
91
}
92
 
93
int main (void)
94
{
95
    int i = 5;
96
    printf ("i: %d -- euler: %e\n", i, eval_euler (i));
97
    printf ("i: %d -- trap: %e\n", i, eval_trapezoid (i));
98
    printf ("i: %d -- romberg: %e\n", i, eval_romberg (i));
99
    return 0;
100
}
101