-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathSimple_iteration_method.m
89 lines (85 loc) · 3.53 KB
/
Simple_iteration_method.m
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
%Mateusz Gabryel
%Metoda iteracji prostej - rozwiązywanie równań nieliniowych
clc
clear
format longG;
format compact;
%-------------------------------------------------------------------------------------
%Równanie:
disp('Szukamy miejsca zerowego funkcji metodą iteracji prostej ')
disp('Mamy dane równanie: f(x)=x^3-3x-6');
disp('---------------------------------------------------------');
%Równanie funkcji:
f = @(x) x^3-3*x-6;
%-------------------------------------------------------------------------------------
%Lokalizacja przedziału [a,b] poprzez sporządzenie tabelki:
tabelka = [0,0,0,0];
disp('Tabelka:');
for x=1:4
tabelka(x) = f(x);
disp(['f(',num2str(x),')= ',num2str(tabelka(x))]);
end
disp('---------------------------------------------------------');
%-------------------------------------------------------------------------------------
%Zlokalizowany przedział [a,b]:
disp('Przedział [a,b]:');
wartosc_referencyjna = 0;
d=sort(abs(wartosc_referencyjna-tabelka));
najblizszy=find(abs(wartosc_referencyjna-tabelka)==d(1));
najblizszy_2 = najblizszy+1;
a = najblizszy;
b = najblizszy_2;
disp(['[',num2str(a),',',num2str(b),']']);
disp('---------------------------------------------------------');
%-------------------------------------------------------------------------------------
%Wyznaczenie środka przedziału [a,b]:
srodek_przedzialu=(a+b)/2;
disp(['Środek przedziału wynosi: ',num2str(srodek_przedzialu)]);
disp('---------------------------------------------------------');
%-------------------------------------------------------------------------------------
%Warunek dokładności:
epsilon = 1e-3;
%Przeksztalcenie postaci z f(x)=0 na x=F(x):
F = @(x) (3*x+6)^(1/3);
%Wzór pochodnej F'(x):
F_pochodna = @(x) (3*x+6)^(-2/3);
%-------------------------------------------------------------------------------------
if(f(a)*f(b) < 0)
if (F_pochodna(srodek_przedzialu) < 1)
disp('Warunek zbieżności został spełniony.');
if (f(srodek_przedzialu) > epsilon)
disp('Wyniki:');
%x(0) = srodek przedzialu -> (a+b)/2
numer_iteracji = 1;
disp(['Iteracja numer: ',num2str(numer_iteracji)]);
disp(['x(',num2str(numer_iteracji-1),')= ',num2str(srodek_przedzialu)]);
%-------------------------------------------------------------------------------------
%Pętla na iteracje:
x(1) = F(srodek_przedzialu);
k=1;
numer_iteracji = numer_iteracji + 1;
while (f(x(k)) > epsilon)
x(k+1)=F(x(k));
disp(['Iteracja numer: ',num2str(numer_iteracji)]);
disp(['x(',num2str(numer_iteracji-1),')= ',num2str(x(k))]);
numer_iteracji = numer_iteracji + 1;
k = k + 1;
end
else
disp('Wartość mniejsza od epsilon, koniec liczenia.')
end
else
disp('Warunek zbieżności nie został spełniony.');
end
else
disp('Warunek f(a)*f(b)<0 nie spełniony');
end
%-------------------------------------------------------------------------------------
%Wyświetlenie zbiorczo wyników po iteracjach w wektorze x:
disp('---------------------------------------------------------');
disp('Zbiorcze wyniki po iteracjach:');
x = [srodek_przedzialu,x];
disp(x);
%-------------------------------------------------------------------------------------
%Koniec
%-------------------------------------------------------------------------------------