-
Notifications
You must be signed in to change notification settings - Fork 0
/
02zad.c
123 lines (86 loc) · 2.74 KB
/
02zad.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
/// gcc -Wall 02zad.c -o 02zad.o -lm
#include <stdio.h>
#include <math.h>
#define E 2.71828183
int iB = 0,
iN = 0;
double equation(double x)
{
return 3 * x + 2 - pow(E, x);
}
double equationDerivative(double x)
{
return 3 - pow(E, x);
}
double bisection(double left, double right, double epsilon)
{
double point = (left + right) / 2;
while(fabs(left - right) > epsilon)
{
iB++;
point = (left + right) / 2;
if (equation(point) == 0) break;
else if (equation(point) * equation(left) < 0) right = point;
else left = point;
}
return point;
}
double newton(double left, double epsilon)
{
double pointPlus, point = left;
while (1)
{
iN++;
pointPlus = point - equation(point) / equationDerivative(point);
if (fabs(point - pointPlus) <= epsilon) break;
else point = pointPlus;
}
return pointPlus;
}
int main()
{
printf("\n Dla równania f(x) = 0, gdzie f(x) = 3x + 2 - e^x, wczytać a, b należące");
printf("\n do zbioru liczb rzeczywistych takie, by a < b oraz f(a) * f(b) < 0. Następnie,");
printf("\n dopóki \"użytownik się nie znudzi\", wczytywać wartości 0 < E < 1 i metodą");
printf("\n połowienia na [a, b] przybliżyc z dokładnością E rozwiązanie tego równania.");
printf("\n Rozwiązanie to przybliżyc również metodą Newtona z x_0 = a, przy czym, x_k");
printf("\n będzie dobrym przybliżeniem, gdy |x_k - x_(k - 1)| <= E. Porównać ilość");
printf("\n kroków wykonanych metodą połowienia i metodą Newtona.\n");
double a, b;
printf("\n Podaj a należące do zbioru liczb rzeczywistych:\n a = ");
scanf("%lf", &a);
b = a;
while(a >= b || equation(a) * equation(b) >= 0)
{
printf("\n Podaj b należące do zbioru liczb rzeczywistych,\n takie by b > a oraz f(b) * f(a) < 0\n b = ");
scanf("%lf", &b);
}
double epsilon, rB, rN;
int choice;
while (1)
{
printf("\n 1 - Przybliż rozwiązanie równania z dokładnością E metodą połowienia i Newtona");
printf("\n 2 - Zakoncz program");
printf("\n Twoj wybor: ");
scanf("%i", &choice);
switch (choice)
{
case 1:
epsilon = 0;
while (epsilon <= 0 || epsilon >= 1)
{
printf("\n Podaj E, takie by 0 < E < 1:\n E = ");
scanf("%lf", &epsilon);
}
rB = bisection(a, b, epsilon);
rN = newton(a, epsilon);
printf("\n Metoda połowienia:\n %lf - przybliżone rozwiązanie\n %i - ilość kroków\n", rB, iB);
printf("\n Metoda Newtona:\n %lf - przybliżone rozwiązanie\n %i - ilość kroków\n", rN, iN);
iB = iN = 0;
break;
case 2:
printf("\n");
return 0;
}
}
}