function [t, w1, w2] = rko4_sys2(f1, f2, a, b, N, alph1, alph2)
= (b - a)/N;
h = w1 = w2 = [];
t 1) = a;
t(1) = alph1;
w1(1) = alph2;
w2(for i = 1:N
= h * f1(t(i), w1(i), w2(i));
k11 = h * f2(t(i), w1(i), w2(i));
k12
= h * f1((t(i)+(h/2)), (w1(i)+(k11/2)), (w2(i)+(k12/2)));
k21 = h * f2((t(i)+(h/2)), (w1(i)+(k11/2)), (w2(i)+(k12/2)));
k22
= h * f1((t(i)+(h/2)), (w1(i)+(k21/2)), (w2(i)+(k22/2)));
k31 = h * f2((t(i)+(h/2)), (w1(i)+(k21/2)), (w2(i)+(k22/2)));
k32
= h * f1((t(i)+h), (w1(i)+k31), (w2(i)+k32));
k41 = h * f2((t(i)+h), (w1(i)+k31), (w2(i)+k32));
k42
i+1) = w1(i) + (k11 + 2*k21 + 2*k31 + k41)/6;
w1(i+1) = w2(i) + (k12 + 2*k22 + 2*k32 + k42)/6;
w2(i+1) = a + i*h;
t(endfor
endfunction
Modul 5 Persamaan Diferensial Numerik: Sistem PDB orde 1 dan PDB orde tinggi
Kembali ke Persamaan Diferensial Numerik
Sistem Persamaan Diferensial: (fourth-order) Runge-Kutta for Systems
Bentuk umum
Bentuk umum sistem Persamaan Diferensial:
\(u'_1 = f_1(t,u_1,u_2,...,u_m)\)
\(u'_2 = f_2(t,u_1,u_2,...,u_m)\)
\(...\)
\(u'_m = f_m(t,u_1,u_2,...,u_m)\)
dengan:
\(a \leq t \leq b\)
\(u_1(a)=a_1, u_2(a)=a_2, ..., u_m(a)=a_m\) (initial value)
Bentuk umum algoritma metode untuk sistem PDB orde 1
for i = 1 : N do
for R in (rumus-rumus untuk iterasi ke-i) do
for j = 1 : m do
Hitung R dengan f_j
endfor
endfor
endfor
Misalnya, apabila ada lima rumus (seperti dalam metode Runge-Kutta orde 4), algoritma untuk sistem menjadi:
for i = 1 : N do
for j = 1 : m do
Hitung Rumus1 dengan f_j
endfor
for j = 1 : m do
Hitung Rumus2 dengan f_j
endfor
for j = 1 : m do
Hitung Rumus3 dengan f_j
endfor
for j = 1 : m do
Hitung Rumus4 dengan f_j
endfor
for j = 1 : m do
Hitung Rumus5 dengan f_j
endfor
endfor
Apabila misalnya rumus pada iterasi 1, 2, 3 berbeda dengan rumus pada iterasi 4+ (seperti untuk metode Adams predictor-corrector orde 4), algoritma untuk sistem bisa seperti berikut:
for i = 1 : 3 do
for j = 1 : m do
Hitung Rumus1 dengan f_j
endfor
for j = 1 : m do
Hitung Rumus2 dengan f_j
endfor
for j = 1 : m do
Hitung Rumus3 dengan f_j
endfor
for j = 1 : m do
Hitung Rumus4 dengan f_j
endfor
for j = 1 : m do
Hitung Rumus5 dengan f_j
endfor
endfor
for i = 4 : N do
for j = 1 : m do
Hitung Rumus1 dengan f_j
endfor
for j = 1 : m do
Hitung Rumus2 dengan f_j
endfor
endfor
Function file: (fourth-order) Runge-Kutta for systems
Pada modul ini, akan dibahas mengenai metode Runge-Kutta orde 4 untuk menyelesaikan sistem persamaan diferensial. Berikut merupakan code dari metode Runge-Kutta untuk sistem persamaan diferensial pada Octave yang perlu disimpan pada function file.
Untuk dua PDB:
Untuk m PDB:
function [t, w] = rko4_sysm(cell_f, a, b, N, alphas)
= length(cell_f);
m
= (b - a) / N;
h = zeros(N + 1, 1);
t = zeros(m, N + 1);
w 1) = a;
t(:, 1) = alphas;
w(
= zeros(m, 1);
k1 = zeros(m, 1);
k2 = zeros(m, 1);
k3 = zeros(m, 1);
k4 for i = 1 : N
i + 1) = t(i) + h;
t(
for j = 1 : m
j) = h * cell_f{j}(t(i), w(:, i));
k1(endfor
for j = 1 : m
j) = h * cell_f{j}(t(i) + (h / 2), w(:, i) + (k1 / 2));
k2(endfor
for j = 1 : m
j) = h * cell_f{j}(t(i) + (h / 2), w(:, i) + (k2 / 2));
k3(endfor
for j = 1 : m
j) = h * cell_f{j}(t(i + 1), w(:, i) + k3);
k4(endfor
for j = 1 : m
j, i + 1) = w(j, i) + (k1(j) + 2 * k2(j) + 2 * k3(j) + k4(j)) / 6;
w(endfor
endfor
endfunction
Contoh sistem PD
\(u'_1 = -4u_1+3u_2+6, \;u_1(0)=0\)
\(u'_2 = -2.4u_1+1.6u_2+3.6, \;u_2(0)=0\)
Akan diuji dengan \(h=0.1\) dan \(0\leq t \leq 0.5\)
Solusi eksak:
\(u_1(t)=-3.375e^{-2t}+1.875e^{-0.4t}+1.5\)
\(u_2(t) = -2.25e^{-2t}+2.25e^{-0.4t}\)
Berikut adalah code script file untuk menjalankan function metode Runge-Kutta untuk sistem PD di atas (menggunakan yang khusus dua persamaan):
= @(t, y1, y2) (-4*y1 + 3*y2 + 6);
f1 = @(t, y1, y2) (-2.4*y1 + 1.6*y2 + 3.6);
f2
= 0;
a = 0.5;
b = 5;
N = 0;
alph1 = 0;
alph2
, w1, w2] = rko4_sys2(f1, f2, a, b, N, alph1, alph2);
[t
= @(t) (-3.375*exp(-2*t) + 1.875*exp(-0.4*t) + 1.5);
sln1 = @(t) (-2.25*exp(-2*t) + 2.25*exp(-0.4*t));
sln2
= w2ex = [];
w1ex for i = 1:length(t)
i) = sln1(t(i));
w1ex(i) = sln2(t(i));
w2ex(endfor
', w1', w2', w1ex', w2ex']
[t
hold on;
fplot(sln1, [a, b], 'r');
fplot(sln2, [a, b], 'b');
scatter(t, w1, 'r');
scatter(t, w2, 'b');
legend('u1', 'u2');
legend('location', 'northwest');
Jika kita run script file tersebut, maka program akan mengeluarkan dua macam output, yaitu tabel serta plot perbandingan solusi eksak dan aproksimasi seperti di bawah ini:
Berikut conoth script file menggunakan kode yang untuk m persamaan.
= @(t, u) (-4*u(1) + 3*u(2) + 6);
f1 = @(t, u) (-2.4*u(1) + 1.6*u(2) + 3.6);
f2
= 0;
a = 0.5;
b = 5;
N = 0;
alpha1 = 0;
alpha2
, w] = rko4_sysm({f1, f2}, a, b, N, [alpha1, alpha2]);
[t
= @(t) (-3.375*exp(-2*t) + 1.875*exp(-0.4*t) + 1.5);
sln1 = @(t) (-2.25*exp(-2*t) + 2.25*exp(-0.4*t));
sln2
= sln1(t);
u1_eksak = sln2(t);
u2_eksak
, w', u1_eksak, u2_eksak]
[t
hold on;
fplot(sln1, [a, b], 'r');
scatter(t, w(1, :), 'r'); % ambil baris pertama yaitu solusi u1
fplot(sln2, [a, b], 'b');
scatter(t, w(2, :), 'b'); % ambil baris kedua yaitu solusi u2
legend('u1 (eksak)', 'w1,i', 'u2 (eksak)', 'w2,i');
legend('location', 'northwest');
ans =
0 0 0 0 0
0.1000 0.5383 0.3196 0.5383 0.3196
0.2000 0.9685 0.5688 0.9685 0.5688
0.3000 1.3107 0.7607 1.3107 0.7607
0.4000 1.5813 0.9063 1.5813 0.9063
0.5000 1.7935 1.0144 1.7935 1.0144
Sebenarnya, kita bisa saja menampilkan dua plot yang terpisah, menggunakan perintah figure
. Selain itu, tabelnya juga bisa dipisah antara tabel untuk \(u_1\) dan tabel untuk \(u_2\), sekaligus menghitung dan menampilkan error.
= @(t, u) (-4*u(1) + 3*u(2) + 6);
f1 = @(t, u) (-2.4*u(1) + 1.6*u(2) + 3.6);
f2
= 0;
a = 0.5;
b = 5;
N = 0;
alpha1 = 0;
alpha2
, w] = rko4_sysm({f1, f2}, a, b, N, [alpha1, alpha2]);
[t
= @(t) (-3.375*exp(-2*t) + 1.875*exp(-0.4*t) + 1.5);
sln1 = @(t) (-2.25*exp(-2*t) + 2.25*exp(-0.4*t));
sln2
= sln1(t);
u1_eksak = sln2(t);
u2_eksak
% menghitung error
= abs(w(1, :)' - u1_eksak);
err_w1 = abs(w(2, :)' - u2_eksak);
err_w2 = sum(err_w1); % norm L1 (taxicab/Manhattan)
err_w1_total = sum(err_w2); % norm L1 (taxicab/Manhattan)
err_w2_total
% menampilkan tabel, termasuk error
format long;
disp("Tabel aproksimasi w1,i, solusi eksak u1(t), dan error:");
, w(1, :)', u1_eksak, err_w1]
[tdisp("Tabel aproksimasi w2,i, solusi eksak u2(t), dan error:");
, w(2, :)', u2_eksak, err_w2]
[tdisp("Error total (norm L1) untuk w1,i:");
disp(err_w1_total);
disp("Error total (norm L1) untuk w2,i:");
disp(err_w2_total);
format;
figure;
hold on;
fplot(sln1, [a, b], 'g');
scatter(t, w(1, :), 'r'); % ambil baris pertama yaitu solusi u1
title("Aproksimasi u1");
legend("u1 (eksak)", "w1,i (aproksimasi)")
legend('location', 'northwest');
figure;
hold on;
fplot(sln2, [a, b], 'g');
scatter(t, w(2, :), 'b'); % ambil baris kedua yaitu solusi u2
title("Aproksimasi u2");
legend("u2 (eksak)", "w2,i (aproksimasi)")
legend('location', 'northwest');
Tabel aproksimasi w1,i, solusi eksak u1(t), dan error:
ans =
0 0 0 0
0.100000000000000 0.538255200000000 0.538263906772417 0.000008706772417
0.200000000000000 0.968498737529088 0.968512994104659 0.000014256575571
0.300000000000000 1.310719039205257 1.310736547027331 0.000017507822074
0.400000000000000 1.581265238963142 1.581284350416023 0.000019111452881
0.500000000000000 1.793507490120283 1.793527048067598 0.000019557947315
Tabel aproksimasi w2,i, solusi eksak u2(t), dan error:
ans =
0 0 0 0
0.100000000000000 0.319626240000000 0.319632043667268 0.000005803667268
0.200000000000000 0.568782173034906 0.568791675789742 0.000009502754836
0.300000000000000 0.760733131868175 0.760744801402045 0.000011669533870
0.400000000000000 0.906320617948927 0.906333355910227 0.000012737961300
0.500000000000000 1.014402416769883 1.014415451789714 0.000013035019830
Error total (norm L1) untuk w1,i:
7.914057025892873e-05
Error total (norm L1) untuk w2,i:
5.274893710444095e-05
Contoh lain: untuk metode Taylor orde \(n\)
function [t, w] = taylor_sysm(cell_f, cell_fp, a, b, N, alphas)
= length(cell_f);
m
= (b - a) / N;
h = length(cell_fp{1}) + 1;
n = zeros(N + 1, 1);
t = zeros(m, N + 1);
w 1) = a;
t(:, 1) = alphas;
w(for i = 1 : N
i + 1) = t(i) + h;
t(
for j = 1 : m
= cell_f{j}(t(i), w(:, i));
T for p = 2 : n
+= h^(p-1) * cell_fp{j}{p-1}(t(i), w(:, i)) / factorial(p);
T endfor
j, i + 1) = w(j, i) + h * T;
w(endfor
endfor
endfunction
Mencoba masalah yang sama,
\(u'_1 = -4u_1+3u_2+6, \;u_1(0)=0\)
\(u'_2 = -2.4u_1+1.6u_2+3.6, \;u_2(0)=0\)
Akan diuji dengan \(h=0.1\) dan \(0\leq t \leq 0.5\)
Solusi eksak:
\(u_1(t)=-3.375e^{-2t}+1.875e^{-0.4t}+1.5\)
\(u_2(t) = -2.25e^{-2t}+2.25e^{-0.4t}\)
Perhatikan bahwa
\[u_1' = f_1(t, u_1, u_2) = -4u_1+3u_2+6\]
\[u_2' = f_2(t, u_1, u_2) = -2.4u_1+1.6u_2+3.6\]
Contoh \(n=1\) (metode Euler)
Apabila kita tidak menyediakan turunan (terhadap \(t\)) dari \(f_1\) maupun dari \(f_2\), maka \(n=1\), yaitu metode Taylor orde \(n\) menjadi metode Euler.
= @(t, u) (-4*u(1) +3*u(2) + 6);
f1 = {}; % tidak menyediakan turunan f1 terhadap t
turunan_f1
= @(t, u) (-2.4*u(1) + 1.6*u(2) + 3.6);
f2 = {}; % tidak menyediakan turunan f2 terhadap t
turunan_f2
= 0;
a = 0.5;
b = 0.1;
h = (b - a) / h;
N = 0;
alpha1 = 0;
alpha2
, w] = taylor_sysm({f1, f2}, {turunan_f1, turunan_f2}, a, b, N, [alpha1, alpha2]);
[t
= @(t) (-3.375*exp(-2*t) + 1.875*exp(-0.4*t) + 1.5);
sln1 = @(t) (-2.25*exp(-2*t) + 2.25*exp(-0.4*t));
sln2
= sln1(t);
u1_eksak = sln2(t);
u2_eksak
% menghitung error
= abs(w(1, :)' - u1_eksak);
err_w1 = abs(w(2, :)' - u2_eksak);
err_w2 = sum(err_w1); % norm L1 (taxicab/Manhattan)
err_w1_total = sum(err_w2); % norm L1 (taxicab/Manhattan)
err_w2_total
% menampilkan tabel, termasuk error
format long;
disp("Tabel aproksimasi w1,i, solusi eksak u1(t), dan error:");
, w(1, :)', u1_eksak, err_w1]
[tdisp("Tabel aproksimasi w2,i, solusi eksak u2(t), dan error:");
, w(2, :)', u2_eksak, err_w2]
[tdisp("Error total (norm L1) untuk w1,i:");
disp(err_w1_total);
disp("Error total (norm L1) untuk w2,i:");
disp(err_w2_total);
format;
figure;
hold on;
fplot(sln1, [a,b], 'r');
scatter(t, w(1, :), 'r');
title("u1");
legend("u1 (eksak)", "w1,i (aproksimasi)")
legend('location', 'northwest')
figure;
hold on;
fplot(sln2, [a,b], 'b');
scatter(t, w(2, :), 'b');
title("u2");
legend("u2 (eksak)", "w2,i (aproksimasi)")
legend('location', 'northwest')
Tabel aproksimasi w1,i, solusi eksak u1(t), dan error:
ans =
0 0 0 0
0.100000000000000 0.600000000000000 0.538263906772417 0.061736093227583
0.200000000000000 1.068000000000000 0.968512994104659 0.099487005895341
0.300000000000000 1.430880000000000 1.310736547027331 0.120143452972669
0.400000000000000 1.710124800000000 1.581284350416023 0.128840449583977
0.500000000000000 1.922903808000000 1.793527048067598 0.129376759932402
Tabel aproksimasi w2,i, solusi eksak u2(t), dan error:
ans =
0 0 0 0
0.100000000000000 0.360000000000000 0.319632043667268 0.040367956332732
0.200000000000000 0.633600000000000 0.568791675789742 0.064808324210258
0.300000000000000 0.838656000000000 0.760744801402045 0.077911198597955
0.400000000000000 0.989429760000000 0.906333355910227 0.083096404089773
0.500000000000000 1.097308569600000 1.014415451789714 0.082893117810286
Error total (norm L1) untuk w1,i:
0.539583761611971
Error total (norm L1) untuk w2,i:
0.349077001041004
Contoh \(n=4\) (metode Taylor orde 4)
Dengan contoh yang sama,
\[u_1' = f_1(t, u_1, u_2) = -4u_1+3u_2+6\]
\[u_2' = f_2(t, u_1, u_2) = -2.4u_1+1.6u_2+3.6\]
Apabila ingin menggunakan metode Taylor orde 4, kita perlu memiliki turunan (terhadap \(t\)) dari \(f_1\) maupun dari \(f_2\) hingga turunan ketiga (\(n-1=4-1=3\)).
Untuk \(f_1\),
$$\[\begin{align*} f_1(t, u_1, u_2) &= -4u_1 + 3u_2 + 6 \\[1em] f_1'(t, u_1, u_2) &= \frac{d}{dt} f_1(t, u_1, u_2) \\ &= \frac{d}{dt} \left(-4u_1 + 3u_2 + 6\right) \\ &= -4u'_1 + 3u'_2 \\ &= -4\left(-4u_1 + 3u_2 + 6\right) + 3\left(-2.4u_1 + 1.6u_2 + 3.6\right) \\ &= 16u_1 - 12u_2 - 24 - 7.2u_1 + 4.8u_2 + 10.8 \\ &= 8.8u_1 - 7.2u_2 - 13.2 \\[1em] f_1''(t, u_1, u_2) &= \frac{d}{dt} f_1'(t, u_1, u_2) \\ &= \frac{d}{dt} \left(8.8u_1 - 7.2u_2 - 13.2\right) \\ &= 8.8u_1' - 7.2u_2' \\ &= 8.8\left(-4u_1 + 3u_2 + 6\right) - 7.2\left(-2.4u_1 + 1.6u_2 + 3.6\right) \\ &= -35.2u_1 + 26.4u_2 + 52.8 + 17.28u_1 - 11.52u_2 - 25.92 \\ &= -17.92u_1 + 14.88u_2 + 26.8 \\[1em] f_1'''(t, u_1, u_2) &= \frac{d}{dt} f_1''(t, u_1, u_2) \\ &= \frac{d}{dt} \left(-17.92u_1 + 14.88u_2 + 26.8\right) \\ &= -17.92u_1' + 14.88u_2' \\ &= -17.92\left(-4u_1 + 3u_2 + 6\right) + 14.88\left(-2.4u_1 + 1.6u_2 + 3.6\right) \\ &= 71.68u_1 - 53.76u_2 -107.52 - 35.712u_1 + 23.808u_2 + 53.568 \\ &= 35.968u_1 - 29.952u_2 - 53.952 \end{align*}\]$$
Untuk \(f_2\),
$$\[\begin{align*} f_2(t, u_1, u_2) &= -2.4u_1 + 1.6u_2 + 3.6 \\[1em] f_2'(t, u_1, u_2) &= \frac{d}{dt} f_2(t, u_1, u_2) \\ &= \frac{d}{dt} \left(-2.4u_1 + 1.6u_2 + 3.6\right) \\ &= -2.4u_1' + 1.6u_2' \\ &= -2.4\left(-4u_1 + 3u_2 + 6\right) + 1.6\left(-2.4u_1 + 1.6u_2 + 3.6\right) \\ &= 9.6u_1 - 7.2u_2 - 14.4 + -3.84u_1 + 2.56u_2 + 5.76 \\ &= 5.76u_1 - 4.64u_2 - 8.64 \\[1em] f_2''(t, u_1, u_2) &= \frac{d}{dt} f_2'(t, u_1, u_2) \\ &= \frac{d}{dt} \left(5.76u_1 - 4.64u_2 - 8.64\right) \\ &= 5.76u_1' - 4.64u_2' \\ &= 5.76\left(-4u_1 + 3u_2 + 6\right) -4.64\left(-2.4u_1 + 1.6u_2 + 3.6\right) \\ &= -23.04u_1 + 17.28u_2 + 34.56 + 11.136u_1 - 7.424u_2 - 16.704 \\ &= -11.904u_1 + 9.856u_2 + 17.856 \\[1em] f_2'''(t, u_1, u_2) &= \frac{d}{dt} f_2''(t, u_!, u_2) \\ &= \frac{d}{dt} \left(-11.904u_1 + 9.856u_2 + 17.856\right) \\ &= -11.904u_1' + 9.856u_2' \\ &= -11.904\left(-4u_1 + 3u_2 + 6\right) + 9.856\left(-2.4u_1 + 1.6u_2 + 3.6\right) \\ &= 47.616u_1 - 35.712u_2 - 71.424 - 23.6544u_1 + 15.7696u_2 + 35.4816 \\ &= 23.9616u_1 - 19.9424u_2 - 35.9424 \end{align*}\]$$
Sehingga, untuk \(f_1\),
$$\[\begin{align*} f_1(t, u_1, u_2) &= -4u_1 + 3u_2 + 6 \\[1em] f_1'(t, u_1, u_2) &= 8.8u_1 - 7.2u_2 - 13.2 \\[1em] f_1''(t, u_1, u_2) &= -17.92u_1 + 14.88u_2 + 26.8 \\[1em] f_1'''(t, u_1, u_2) &= 35.968u_1 - 29.952u_2 - 53.952 \end{align*}\]$$
dan untuk \(f_2\),
$$\[\begin{align*} f_2(t, u_1, u_2) &= -2.4u_1 + 1.6u_2 + 3.6 \\[1em] f_2'(t, u_1, u_2) &= 5.76u_1 - 4.64u_2 - 8.64 \\[1em] f_2''(t, u_1, u_2) &= -11.904u_1 + 9.856u_2 + 17.856 \\[1em] f_2'''(t, u_1, u_2) &= 23.9616u_1 - 19.9424u_2 - 35.9424 \end{align*}\]$$
Fungsi \(f_1\) dan \(f_2\) serta turunan-turunannya bisa kita gunakan sebagai berikut.
= @(t, u) (-4*u(1) +3*u(2) + 6);
f1 = @(t, u) (8.8*u(1) - 7.2*u(2) - 13.2);
f1p = @(t, u) (-17.92*u(1) + 14.88*u(2) + 26.8);
f1pp = @(t, u) (35.968*u(1) - 29.952*u(2) - 53.952);
f1ppp = {f1p, f1pp, f1ppp};
turunan_f1
= @(t, u) (-2.4*u(1) + 1.6*u(2) + 3.6);
f2 = @(t, u) (5.76*u(1) - 4.64*u(2) - 8.64);
f2p = @(t, u) (-11.904*u(1) + 9.856*u(2) + 17.856);
f2pp = @(t, u) (23.9616*u(1) - 19.9424*u(2) - 35.9424);
f2ppp = {f2p, f2pp, f2ppp};
turunan_f2
= 0;
a = 0.5;
b = 0.1;
h = (b - a) / h;
N = 0;
alpha1 = 0;
alpha2
, w] = taylor_sysm({f1, f2}, {turunan_f1, turunan_f2}, a, b, N, [alpha1, alpha2]);
[t
= @(t) (-3.375*exp(-2*t) + 1.875*exp(-0.4*t) + 1.5);
sln1 = @(t) (-2.25*exp(-2*t) + 2.25*exp(-0.4*t));
sln2
= sln1(t);
u1_eksak = sln2(t);
u2_eksak
% menghitung error
= abs(w(1, :)' - u1_eksak);
err_w1 = abs(w(2, :)' - u2_eksak);
err_w2 = sum(err_w1); % norm L1 (taxicab/Manhattan)
err_w1_total = sum(err_w2); % norm L1 (taxicab/Manhattan)
err_w2_total
% menampilkan tabel, termasuk error
format long;
disp("Tabel aproksimasi w1,i, solusi eksak u1(t), dan error:");
, w(1, :)', u1_eksak, err_w1]
[tdisp("Tabel aproksimasi w2,i, solusi eksak u2(t), dan error:");
, w(2, :)', u2_eksak, err_w2]
[tdisp("Error total (norm L1) untuk w1,i:");
disp(err_w1_total);
disp("Error total (norm L1) untuk w2,i:");
disp(err_w2_total);
format;
figure;
hold on;
fplot(sln1, [a,b], 'r');
scatter(t, w(1, :), 'r');
title("u1");
legend("u1 (eksak)", "w1,i (aproksimasi)")
legend('location', 'northwest')
figure;
hold on;
fplot(sln2, [a,b], 'b');
scatter(t, w(2, :), 'b');
title("u2");
legend("u2 (eksak)", "w2,i (aproksimasi)")
legend('location', 'northwest')
Tabel aproksimasi w1,i, solusi eksak u1(t), dan error:
ans =
0 0 0 0
0.100000000000000 0.538241866666667 0.538263906772417 0.000022040105751
0.200000000000000 0.968476855353088 0.968512994104659 0.000036138751571
0.300000000000000 1.310692432573591 1.310736547027331 0.000044114453740
0.400000000000000 1.581236949834047 1.581284350416023 0.000047400581977
0.500000000000000 1.793479923348867 1.793527048067598 0.000047124718731
Tabel aproksimasi w2,i, solusi eksak u2(t), dan error:
ans =
0 0 0 0
0.100000000000000 0.319626240000000 0.319632043667268 0.000005803667268
0.200000000000000 0.568785014157039 0.568791675789742 0.000006661632703
0.300000000000000 0.760741028831847 0.760744801402045 0.000003772570198
0.400000000000000 0.906335276984882 0.906333355910227 0.000001921074655
0.500000000000000 1.014425131989109 1.014415451789714 0.000009680199395
Error total (norm L1) untuk w1,i:
1.968186117699000e-04
Error total (norm L1) untuk w2,i:
2.783914421899958e-05
Contoh lain: untuk metode Adams predictor-corrector orde 4
function [t, w] = adams_pc_orde4_sysm(cell_f, a, b, N, alphas)
= length(cell_f);
m
% Inisiasi variabel awal
= (b - a) / N;
h = zeros(N + 1, 1);
t = zeros(m, N + 1);
w 1) = a;
t(:, 1) = alphas;
w(
% Hitung w(2), w(3), w(4) menggunakan metode Runge-Kutta orde 4
= zeros(m, 1);
k1 = zeros(m, 1);
k2 = zeros(m, 1);
k3 = zeros(m, 1);
k4 for i = 1 : 3
i + 1) = t(i) + h;
t(
for j = 1 : m
j) = h * cell_f{j}(t(i), w(:,i));
k1(endfor
for j = 1 : m
j) = h * cell_f{j}(t(i) + (h/2), w(:,i) + (k1/2));
k2(endfor
for j = 1 : m
j) = h * cell_f{j}(t(i) + (h/2), w(:,i) + (k2/2));
k3(endfor
for j = 1 : m
j) = h * cell_f{j}(t(i + 1), w(:,i) + k3);
k4(endfor
for j = 1 : m
j,i+1) = w(j,i) + (k1(j) + 2*k2(j) + 2*k3(j) + k4(j)) / 6;
w(endfor
endfor
% Algoritma utama Adams Predictor-Corrector orde 4
= zeros(m, 1);
m0 = zeros(m, 1);
m1 = zeros(m, 1);
m2 = zeros(m, 1);
m3 = zeros(m, 1);
m4 for i = 4 : N
i + 1) = t(i) + h;
t(
for j = 1 : m
j) = cell_f{j}(t(i), w(:,i));
m1(endfor
for j = 1 : m
j) = cell_f{j}(t(i-1), w(:,i-1));
m2(endfor
for j = 1 : m
j) = cell_f{j}(t(i-2), w(:,i-2));
m3(endfor
for j = 1 : m
j) = cell_f{j}(t(i-3), w(:,i-3));
m4(endfor
% Adams-Bashforth orde 4 (four-step)
for j = 1 : m
j,i+1) = w(j,i) + (h/24) * (55*m1(j) - 59*m2(j) + 37*m3(j) - 9*m4(j));
w(endfor
% Adams-Moulton orde 4 (three-step)
for j = 1 : m
j) = cell_f{j}(t(i+1), w(:,i+1));
m0(endfor
for j = 1 : m
j,i+1) = w(j,i) + (h/24) * (9*m0(j) + 19*m1(j) - 5*m2(j) + m3(j));
w(endfor
endfor
endfunction
Mencoba untuk masalah yang sama, yaitu
\(u'_1 = -4u_1+3u_2+6, \;u_1(0)=0\)
\(u'_2 = -2.4u_1+1.6u_2+3.6, \;u_2(0)=0\)
Akan diuji dengan \(h=0.1\) dan \(0\leq t \leq 0.5\)
Solusi eksak:
\(u_1(t)=-3.375e^{-2t}+1.875e^{-0.4t}+1.5\)
\(u_2(t) = -2.25e^{-2t}+2.25e^{-0.4t}\)
= @(t, u) (-4*u(1) +3*u(2) + 6);
f1 = @(t, u) (-2.4*u(1) + 1.6*u(2) + 3.6);
f2
= 0;
a = 0.5;
b = 0.1;
h = (b - a) / h;
N = 0;
alpha1 = 0;
alpha2
, w] = adams_pc_orde4_sysm({f1, f2}, a, b, N, [alpha1, alpha2]);
[t
= @(t) (-3.375*exp(-2*t) + 1.875*exp(-0.4*t) + 1.5);
sln1 = @(t) (-2.25*exp(-2*t) + 2.25*exp(-0.4*t));
sln2
= sln1(t);
u1_eksak = sln2(t);
u2_eksak
% menghitung error
= abs(w(1, :)' - u1_eksak);
err_w1 = abs(w(2, :)' - u2_eksak);
err_w2 = sum(err_w1); % norm L1 (taxicab/Manhattan)
err_w1_total = sum(err_w2); % norm L1 (taxicab/Manhattan)
err_w2_total
% menampilkan tabel, termasuk error
format long;
disp("Tabel aproksimasi w1,i, solusi eksak u1(t), dan error:");
, w(1, :)', u1_eksak, err_w1]
[tdisp("Tabel aproksimasi w2,i, solusi eksak u2(t), dan error:");
, w(2, :)', u2_eksak, err_w2]
[tdisp("Error total (norm L1) untuk w1,i:");
disp(err_w1_total);
disp("Error total (norm L1) untuk w2,i:");
disp(err_w2_total);
format;
figure;
hold on;
fplot(sln1, [a,b], 'r');
scatter(t, w(1, :), 'r');
title("u1");
legend("u1 (eksak)", "w1,i (aproksimasi)")
legend('location', 'northwest')
figure;
hold on;
fplot(sln2, [a,b], 'b');
scatter(t, w(2, :), 'b');
title("u2");
legend("u2 (eksak)", "w2,i (aproksimasi)")
legend('location', 'northwest')
Tabel aproksimasi w1,i, solusi eksak u1(t), dan error:
ans =
0 0 0 0
0.100000000000000 0.538255200000000 0.538263906772417 0.000008706772417
0.200000000000000 0.968498737529088 0.968512994104659 0.000014256575571
0.300000000000000 1.310719039205257 1.310736547027331 0.000017507822074
0.400000000000000 1.581306013228106 1.581284350416023 0.000021662812083
0.500000000000000 1.793573533217050 1.793527048067598 0.000046485149452
Tabel aproksimasi w2,i, solusi eksak u2(t), dan error:
ans =
0 0 0 0
0.100000000000000 0.319626240000000 0.319632043667268 0.000005803667268
0.200000000000000 0.568782173034906 0.568791675789742 0.000009502754836
0.300000000000000 0.760733131868175 0.760744801402045 0.000011669533870
0.400000000000000 0.906347797116244 0.906333355910227 0.000014441206017
0.500000000000000 1.014446438459705 1.014415451789714 0.000030986669992
Error total (norm L1) untuk w1,i:
1.086191315975427e-04
Error total (norm L1) untuk w2,i:
7.240383198242606e-05
PDB orde tinggi
(penjelasan tanpa kode) Mengubah PDB orde tinggi menjadi sistem PDB orde 1
Misalkan ada PDB orde \(m\) (tidak harus linier),
\[\dots y^{\left(m\right)}\left(t\right) + \dots y^{\left(m-1\right)}\left(t\right) + \dots + \dots y''\left(t\right) + \dots y'\left(t\right) + \dots y\left(t\right) + \dots = 0\]
yang bisa dipindah ruas dsb, untuk memperoleh bentuk:
\[y^{\left(m\right)}\left(t\right) = \left[\text{sisanya}\right]\]
atau biasa ditulis
\[y^{\left(m\right)}\left(t\right) = f\left(t, y, y', y'', \dots, y^{\left(m-1\right)}\right)\]
Kita bisa mendefinisikan fungsi \(u_1 \left(t\right), u_2 \left(t\right), \dots, u_m \left(t\right)\) sebagai berikut,
\[\begin{align*} u_1 \left(t\right) &= y\left(t\right) \\ u_2 \left(t\right) &= y'\left(t\right) \\ &\vdots \\ u_j \left(t\right) &= y^{\left(j-1\right)}\left(t\right) \\ &\vdots \\ u_{m-1} \left(t\right) &= y^{\left(m-2\right)}\left(t\right) \\ u_m \left(t\right) &= y^{\left(m-1\right)}\left(t\right) \end{align*}\]
Sehingga turunannya terhadap \(t\) adalah,
\[\begin{align*} \frac{du_1}{dt} &= y'\left(t\right) \\ \frac{du_2}{dt} &= y''\left(t\right) \\ &\vdots \\ \frac{du_j}{dt} &= y^{\left(j\right)}\left(t\right) \\ &\vdots \\ \frac{du_{m-1}}{dt} &= y^{\left(m-1\right)}\left(t\right) \\ \frac{du_m}{dt} &= y^{\left(m\right)}\left(t\right) \end{align*}\]
Ternyata, \(u_1'\left(t\right) = y'\left(t\right) = u_2\left(t\right)\), lalu \(u_2'\left(t\right) = y''\left(t\right) = u_3\left(t\right)\), dan seterusnya. Untuk yang terakhir, sebelumnya kita sudah menuliskan
\[y^{\left(m\right)}\left(t\right) = f\left(t, y, y', y'', \dots, y^{\left(m-1\right)}\right)\]
sedangkan \(\frac{du_m}{dt} = y^{\left(m\right)}\left(t\right)\).
Sehingga, bisa ditulis:
\[\begin{align*} \frac{du_1}{dt} &= u_2\left(t\right) \\ \frac{du_2}{dt} &= u_3\left(t\right) \\ &\vdots \\ \frac{du_j}{dt} &= u_{j+1}\left(t\right) \\ &\vdots \\ \frac{du_{m-1}}{dt} &= u_m\left(t\right) \\ \frac{du_m}{dt} &= f\left(t, y, y', y'', \dots, y^{\left(m-1\right)}\right) \\ \end{align*}\]
yaitu sistem PDB orde 1 dalam \(u_1 \left(t\right), u_2 \left(t\right), \dots, u_m \left(t\right)\).
Solusi \(y\left(t\right)\) bisa diperoleh dari \(u_1 \left(t\right)\). Apabila ditanya \(y'\left(t\right)\), maka bisa diperoleh dari \(u_2 \left(t\right)\). Apabila ditanya \(y''\left(t\right)\), maka bisa diperoleh dari \(u_3 \left(t\right)\), dan seterusnya.
Contoh: mengubah PDB orde 3 menjadi sistem PDB
Menggunakan soal Exercise Set 5.9 no. 3d dari buku,
\[t^3 y''' - t^2 y'' + 3ty' - 4y = 5t^3 \ln{t} + 9t^3, \quad 1 \le t \le 2\]
\[y(1) = 0, \quad y'(1) = 1, \quad y''(1) = 3\]
dengan \(h=0.1\), dan diketahui solusi eksak
\[y(t) = -t^2 + t\cos{\left(\ln{t}\right)} + t\sin{\left(\ln{t}\right)} + t^3 \ln{t}\]
\[y'(t) = -2t + 2\cos{\left(\ln{t}\right)} + t^2 + 3t^2 \ln{t}\]
\[y''(t) = -2 - \frac{2}{t}\sin{\left(\ln{t}\right)} + 5t + 6t \ln{t}\]
Perhatikan bahwa turunan tertinggi adalah turunan ketiga, sehingga PDB yang diberikan adalah PDB orde 3, yaitu PDB orde \(m\) dengan \(m=3\).
Kita bisa melakukan pindah ruas agar memperoleh bentuk
\[y''' = \left[\text{sisanya}\right]\]
atau bisa ditulis
\[y''' = f\left(t, y, y', y''\right)\]
seperti berikut:
\[t^3 y''' - t^2 y'' + 3ty' - 4y = 5t^3 \ln{t} + 9t^3\]
\[t^3 y''' = t^2 y'' - 3ty' + 4y + 5t^3 \ln{t} + 9t^3\]
\[y''' = \frac{1}{t^3}\left(t^2 y'' - 3ty' + 4y + 5t^3 \ln{t} + 9t^3\right)\]
\[y''' = \frac{1}{t} y'' - \frac{3}{t^2}y' + \frac{4}{t^3}y + 5 \ln{t} + 9\]
Sehingga bisa ditulis
\[y''' = f\left(t, y, y', y''\right) = \frac{1}{t} y'' - \frac{3}{t^2}y' + \frac{4}{t^3}y + 5 \ln{t} + 9, \quad 1 \le t \le 2\]
\[y(1) = 0, \quad y'(1) = 1, \quad y''(1) = 3\]
PDB orde \(m=3\) bisa diubah menjadi sistem PDB orde 1 yang terdiri dari \(m=3\) persamaan, dengan permisalan
\[u_1(t) = y(t)\]
\[u_2(t) = y'(t)\]
\[u_3(t) = y''(t)\]
sehingga
\[\begin{align*} u_1'(t) &= y'(t) = u_2(t) \\ u_2'(t) &= y''(t) = u_3(t) \\ u_3'(t) &= y'''(t) = f\left(t, y, y', y''\right) = \frac{1}{t} y'' - \frac{3}{t^2}y' + \frac{4}{t^3}y + 5 \ln{t} + 9 \end{align*}\]
atau bisa ditulis
\[\begin{align*} u_1'(t) &= u_2(t) \\ u_2'(t) &= u_3(t) \\ u_3'(t) &= f\left(t, u_1, u_2, u_3\right) = \frac{1}{t} u_3(t) - \frac{3}{t^2}u_2(t) + \frac{4}{t^3}u_1(t) + 5 \ln{t} + 9 \end{align*}\]
Berdasarkan permisalan, nilai-nilai awal
\[y(1) = 0, \quad y'(1) = 1, \quad y''(1) = 3\]
menjadi
\[u_1(1) = 0, \quad u_2(1) = 1, \quad u_3(1) = 3\]
Sehingga, diperoleh sistem PDB orde 3 sebagai berikut:
\[\begin{align*} u_1' &= u_2, \quad u_1(1) = 0 \\ u_2' &= u_3, \quad u_2(1) = 1 \\ u_3' &= \frac{1}{t} u_3 - \frac{3}{t^2}u_2 + \frac{4}{t^3}u_1 + 5 \ln{t} + 9, \quad u_3(1) = 3 \end{align*}\]
Kita dapat memisalkan
\[\begin{align*} f_1\left(t, u_1, u_2, u_3\right) &= u_1' \\ f_2\left(t, u_1, u_2, u_3\right) &= u_2' \\ f_3\left(t, u_1, u_2, u_3\right) &= u_3' \end{align*}\]
yaitu
\[\begin{align*} f_1\left(t, u_1, u_2, u_3\right) &= u_2 \\ f_2\left(t, u_1, u_2, u_3\right) &= u_3 \\ f_3\left(t, u_1, u_2, u_3\right) &= \frac{1}{t} u_3 - \frac{3}{t^2}u_2 + \frac{4}{t^3}u_1 + 5 \ln{t} + 9 \end{align*}\]
agar sistem PDB orde 3 di atas bisa ditulis dalam bentuk umum sistem PDB orde 1, yaitu
\[\begin{align*} u_1' &= f_1\left(t, u_1, u_2, u_3\right) \\ u_2' &= f_2\left(t, u_1, u_2, u_3\right) \\ u_3' &= f_3\left(t, u_1, u_2, u_3\right) \end{align*}\]
masih dengan nilai-nilai awal
\[u_1(1) = 0, \quad u_2(1) = 1, \quad u_3(1) = 3\]
Setelah bentuknya diubah menjadi sistem PDB orde 1, kita dapat menyelesaikannya menggunakan algoritma-algoritma sistem PDB orde 1 seperti biasa. Berdasarkan permisalan yang telah dilakukan,
solusi \(u_1(t)\) akan menjadi solusi \(y(t)\), biasanya ini yang diminta
solusi \(u_2(t)\) akan menjadi solusi \(y'(t)\)
solusi \(u_3(t)\) akan menjadi solusi \(y''(t)\)
Walaupun mungkin kita hanya memerlukan solusi \(y(t)\), algoritma yang tersedia mengharuskan semua nilai dihitung di tiap iterasi. Tidak ada salahnya juga; siapa tahu, misalnya solusi \(y'(t)\) atau solusi \(y''(t)\) diperlukan nantinya.
(Apabila diperlukan, nilai \(y^{\left(m\right)}(t)\), yaitu nilai \(y'''(t)\), bisa dihitung menggunakan \(f\left(t, y, y', y'', \dots, y^{\left(m-1\right)}\right)\), yaitu menggunakan \(f\left(t, y, y', y''\right) = \frac{1}{t} y'' - \frac{3}{t^2}y' + \frac{4}{t^3}y + 5 \ln{t} + 9\).)
Contoh metode Runge-Kutta orde 4
Sistem kita adalah
\[\begin{align*} u_1' &= f_1\left(t, u_1, u_2, u_3\right) = u_2 \\ u_2' &= f_2\left(t, u_1, u_2, u_3\right) = u_3 \\ u_3' &= f_3\left(t, u_1, u_2, u_3\right) = \frac{1}{t} u_3 - \frac{3}{t^2}u_2 + \frac{4}{t^3}u_1 + 5 \ln{t} + 9 \end{align*}\]
\[1 \le t \le 2\]
\[u_1(1) = 0, \quad u_2(1) = 1, \quad u_3(1) = 3\]
dengan \(h=0.1\), dan diketahui solusi eksak
\[y(t) = -t^2 + t\cos{\left(\ln{t}\right)} + t\sin{\left(\ln{t}\right)} + t^3 \ln{t}\]
\[y'(t) = -2t + 2\cos{\left(\ln{t}\right)} + t^2 + 3t^2 \ln{t}\]
\[y''(t) = -2 - \frac{2}{t}\sin{\left(\ln{t}\right)} + 5t + 6t \ln{t}\]
(yang bisa dianggap solusi eksak untuk \(u_1\), \(u_2\), dan \(u_3\), sesuai permisalan)
Kita bisa menggunakan metode Runge-Kutta orde 4 untuk sistem, seperti berikut.
= @(t, u) u(2);
f1 = @(t, u) u(3);
f2 = @(t, u) (1/t .* u(3) - 3/(t.^2) .* u(2) + 4/(t.^3) .* u(1) + 5*log(t) + 9);
f3
= 1;
a = 2;
b = 0.1;
h = (b - a) / h;
N = 0;
alpha1 = 1;
alpha2 = 3;
alpha3
, w] = rko4_sysm({f1, f2, f3}, a, b, N, [alpha1, alpha2, alpha3]);
[t
% solusi eksak
= @(t) (-t.^2 + t .* cos(log(t)) + t .* sin(log(t)) + t.^3 .* log(t));
sln1 = @(t) (-2*t + 2 * cos(log(t)) + t.^2 + 3 * t.^2 .* log(t));
sln2 = @(t) (-2 - 2./t .* sin(log(t)) + 5*t + 6 * t .* log(t));
sln3
= sln1(t);
u1_eksak = sln2(t);
u2_eksak = sln3(t);
u3_eksak
, w', u1_eksak, u2_eksak, u3_eksak]
[t
figure;
hold on;
fplot(sln1, [a, b], 'r');
scatter(t, w(1, :), 'r'); % ambil baris pertama yaitu solusi u1
title("Solusi u1(t) atau y(t)");
legend("Solusi eksak", "w1,i (aproksimasi)");
legend('location', 'northwest');
figure;
hold on;
fplot(sln2, [a, b], 'g');
scatter(t, w(2, :), 'g'); % ambil baris kedua yaitu solusi u2
title("Solusi u2(t) atau y'(t)");
legend("Solusi eksak", "w2,i (aproksimasi)");
legend('location', 'northwest');
figure;
hold on;
fplot(sln3, [a, b], 'b');
scatter(t, w(3, :), 'b'); % ambil baris ketiga yaitu solusi u3
title("Solusi u3(t) atau y''(t)");
legend("Solusi eksak", "w3,i (aproksimasi)");
legend('location', 'northwest');
ans =
1.0000 0 1.0000 3.0000 0 1.0000 3.0000
1.1000 0.1165 1.3469 3.9560 0.1165 1.3469 3.9560
1.2000 0.2727 1.7945 5.0105 0.2727 1.7945 5.0105
1.3000 0.4791 2.3517 6.1474 0.4791 2.3517 6.1474
1.4000 0.7470 3.0263 7.3547 0.7470 3.0263 7.3547
1.5000 1.0885 3.8247 8.6232 1.0885 3.8247 8.6233
1.6000 1.5163 4.7527 9.9459 1.5163 4.7528 9.9459
1.7000 2.0435 5.8155 11.3170 2.0435 5.8155 11.3170
1.8000 2.6840 7.0176 12.7319 2.6840 7.0176 12.7320
1.9000 3.4518 8.3632 14.1869 3.4518 8.3633 14.1869
2.0000 4.3616 9.8562 15.6788 4.3616 9.8562 15.6788
Apabila perlu dihitung errornya, kodenya bisa menjadi seperti berikut:
= @(t, u) u(2);
f1 = @(t, u) u(3);
f2 = @(t, u) (1/t .* u(3) - 3/(t.^2) .* u(2) + 4/(t.^3) .* u(1) + 5*log(t) + 9);
f3
= 1;
a = 2;
b = 0.1;
h = (b - a) / h;
N = 0;
alpha1 = 1;
alpha2 = 3;
alpha3
, w] = rko4_sysm({f1, f2, f3}, a, b, N, [alpha1, alpha2, alpha3]);
[t
% solusi eksak
= @(t) (-t.^2 + t .* cos(log(t)) + t .* sin(log(t)) + t.^3 .* log(t));
sln1 = @(t) (-2*t + 2 * cos(log(t)) + t.^2 + 3 * t.^2 .* log(t));
sln2 = @(t) (-2 - 2./t .* sin(log(t)) + 5*t + 6 * t .* log(t));
sln3
= sln1(t);
u1_eksak = sln2(t);
u2_eksak = sln3(t);
u3_eksak
% menghitung error
= abs(w(1, :)' - u1_eksak);
err_w1 = abs(w(2, :)' - u2_eksak);
err_w2 = abs(w(3, :)' - u3_eksak);
err_w3 = sum(err_w1); % norm L1 (taxicab/Manhattan)
err_w1_total = sum(err_w2); % norm L1 (taxicab/Manhattan)
err_w2_total = sum(err_w3); % norm L1 (taxicab/Manhattan)
err_w3_total
% menampilkan tabel, termasuk error
format long;
disp("Tabel aproksimasi w1,i, solusi eksak u1(t), dan error:");
, w(1, :)', u1_eksak, err_w1]
[tdisp("Tabel aproksimasi w2,i, solusi eksak u2(t), dan error:");
, w(2, :)', u2_eksak, err_w2]
[tdisp("Tabel aproksimasi w3,i, solusi eksak u3(t), dan error:");
, w(3, :)', u3_eksak, err_w3]
[tdisp("Error total (norm L1) untuk w1,i:");
disp(err_w1_total);
disp("Error total (norm L1) untuk w2,i:");
disp(err_w2_total);
disp("Error total (norm L1) untuk w3,i:");
disp(err_w3_total);
format;
figure;
hold on;
fplot(sln1, [a, b], 'r');
scatter(t, w(1, :), 'r'); % ambil baris pertama yaitu solusi u1
title("Solusi u1(t) atau y(t)");
legend("Solusi eksak", "w1,i (aproksimasi)");
legend('location', 'northwest');
figure;
hold on;
fplot(sln2, [a, b], 'g');
scatter(t, w(2, :), 'g'); % ambil baris kedua yaitu solusi u2
title("Solusi u2(t) atau y'(t)");
legend("Solusi eksak", "w2,i (aproksimasi)");
legend('location', 'northwest');
figure;
hold on;
fplot(sln3, [a, b], 'b');
scatter(t, w(3, :), 'b'); % ambil baris ketiga yaitu solusi u3
title("Solusi u3(t) atau y''(t)");
legend("Solusi eksak", "w3,i (aproksimasi)");
legend('location', 'northwest');
Tabel aproksimasi w1,i, solusi eksak u1(t), dan error:
ans =
1.000000000000000 0 0 0
1.100000000000000 0.116547765077132 0.116547953377741 0.000000188300609
1.200000000000000 0.272737593417178 0.272737913137213 0.000000319720036
1.300000000000000 0.479101055922200 0.479101624357037 0.000000568434836
1.400000000000000 0.746997034090164 0.746998073629463 0.000001039539299
1.500000000000000 1.088490794798314 1.088492594095847 0.000001799297533
1.600000000000001 1.516261839314915 1.516264730431065 0.000002891116151
1.700000000000001 2.043532071845456 2.043536416215900 0.000004344370444
1.800000000000001 2.684008671952472 2.684014851438298 0.000006179485825
1.900000000000001 3.451837841224076 3.451846252199066 0.000008410974990
2.000000000000001 4.361566750517713 4.361577799834785 0.000011049317072
Tabel aproksimasi w2,i, solusi eksak u2(t), dan error:
ans =
1.000000000000000 1.000000000000000 1.000000000000000 0
1.100000000000000 1.346897244698541 1.346898796867440 0.000001552168898
1.200000000000000 1.794476400848503 1.794479954480695 0.000003553632192
1.300000000000000 2.351739790653634 2.351745763551004 0.000005972897370
1.400000000000000 3.026298521404629 3.026307271933378 0.000008750528749
1.500000000000000 3.824715727217527 3.824727552609112 0.000011825391586
1.600000000000001 4.752746018651163 4.752761161714929 0.000015143063766
1.700000000000001 5.815506875823461 5.815525533513762 0.000018657690301
1.800000000000001 7.017604163612482 7.017626495142349 0.000022331529867
1.900000000000001 8.363225949009005 8.363252082824820 0.000026133815815
2.000000000000001 9.856213929909213 9.856243969447302 0.000030039538089
Tabel aproksimasi w3,i, solusi eksak u3(t), dan error:
ans =
Columns 1 through 3:
1.000000000000000e+00 3.000000000000000e+00 3.000000000000000e+00
1.100000000000000e+00 3.956010469157951e+00 3.956018195368995e+00
1.200000000000000e+00 5.010512494112985e+00 5.010526645695958e+00
1.300000000000000e+00 6.147399365577646e+00 6.147418750933507e+00
1.400000000000000e+00 7.354687155068509e+00 7.354710775454516e+00
1.500000000000000e+00 8.623230661511867e+00 8.623257706687671e+00
1.600000000000001e+00 9.945893119295571e+00 9.945922939388453e+00
1.700000000000001e+00 1.131699337911594e+01 1.131702545393904e+01
1.800000000000001e+00 1.273192816711290e+01 1.273196207929798e+01
1.900000000000001e+00 1.418690793287085e+01 1.418694334605300e+01
2.000000000000001e+00 1.567876824876296e+01 1.567880489040572e+01
Column 4:
0
7.726211044278841e-06
1.415158297302099e-05
1.938535586099022e-05
2.362038600622896e-05
2.704517580376375e-05
2.982009288210463e-05
3.207482310685350e-05
3.391218507609040e-05
3.541318215205536e-05
3.664164275640758e-05
Error total (norm L1) untuk w1,i:
3.679055679502163e-05
Error total (norm L1) untuk w2,i:
1.439602566337683e-04
Error total (norm L1) untuk w3,i:
2.597906376617942e-04
Contoh metode Adams Predictor-Corrector orde 4
Kita bisa menggunakan kode di atas, tinggal menukar fungsi rko4_sysm
dengan adams_pc_orde4_sysm
= @(t, u) u(2);
f1 = @(t, u) u(3);
f2 = @(t, u) (1/t .* u(3) - 3/(t.^2) .* u(2) + 4/(t.^3) .* u(1) + 5*log(t) + 9);
f3
= 1;
a = 2;
b = 0.1;
h = (b - a) / h;
N = 0;
alpha1 = 1;
alpha2 = 3;
alpha3
, w] = adams_pc_orde4_sysm({f1, f2, f3}, a, b, N, [alpha1, alpha2, alpha3]);
[t
% solusi eksak
= @(t) (-t.^2 + t .* cos(log(t)) + t .* sin(log(t)) + t.^3 .* log(t));
sln1 = @(t) (-2*t + 2 * cos(log(t)) + t.^2 + 3 * t.^2 .* log(t));
sln2 = @(t) (-2 - 2./t .* sin(log(t)) + 5*t + 6 * t .* log(t));
sln3
= sln1(t);
u1_eksak = sln2(t);
u2_eksak = sln3(t);
u3_eksak
, w', u1_eksak, u2_eksak, u3_eksak]
[t
figure;
hold on;
fplot(sln1, [a, b], 'r');
scatter(t, w(1, :), 'r'); % ambil baris pertama yaitu solusi u1
title("Solusi u1(t) atau y(t)");
legend("Solusi eksak", "w1,i (aproksimasi)");
legend('location', 'northwest');
figure;
hold on;
fplot(sln2, [a, b], 'g');
scatter(t, w(2, :), 'g'); % ambil baris kedua yaitu solusi u2
title("Solusi u2(t) atau y'(t)");
legend("Solusi eksak", "w2,i (aproksimasi)");
legend('location', 'northwest');
figure;
hold on;
fplot(sln3, [a, b], 'b');
scatter(t, w(3, :), 'b'); % ambil baris ketiga yaitu solusi u3
title("Solusi u3(t) atau y''(t)");
legend("Solusi eksak", "w3,i (aproksimasi)");
legend('location', 'northwest');
ans =
1.0000 0 1.0000 3.0000 0 1.0000 3.0000
1.1000 0.1165 1.3469 3.9560 0.1165 1.3469 3.9560
1.2000 0.2727 1.7945 5.0105 0.2727 1.7945 5.0105
1.3000 0.4791 2.3517 6.1474 0.4791 2.3517 6.1474
1.4000 0.7470 3.0263 7.3547 0.7470 3.0263 7.3547
1.5000 1.0885 3.8248 8.6232 1.0885 3.8247 8.6233
1.6000 1.5163 4.7528 9.9459 1.5163 4.7528 9.9459
1.7000 2.0435 5.8156 11.3170 2.0435 5.8155 11.3170
1.8000 2.6840 7.0177 12.7319 2.6840 7.0176 12.7320
1.9000 3.4518 8.3633 14.1869 3.4518 8.3633 14.1869
2.0000 4.3616 9.8563 15.6787 4.3616 9.8562 15.6788
Apabila perlu dihitung errornya:
= @(t, u) u(2);
f1 = @(t, u) u(3);
f2 = @(t, u) (1/t .* u(3) - 3/(t.^2) .* u(2) + 4/(t.^3) .* u(1) + 5*log(t) + 9);
f3
= 1;
a = 2;
b = 0.1;
h = (b - a) / h;
N = 0;
alpha1 = 1;
alpha2 = 3;
alpha3
, w] = adams_pc_orde4_sysm({f1, f2, f3}, a, b, N, [alpha1, alpha2, alpha3]);
[t
% solusi eksak
= @(t) (-t.^2 + t .* cos(log(t)) + t .* sin(log(t)) + t.^3 .* log(t));
sln1 = @(t) (-2*t + 2 * cos(log(t)) + t.^2 + 3 * t.^2 .* log(t));
sln2 = @(t) (-2 - 2./t .* sin(log(t)) + 5*t + 6 * t .* log(t));
sln3
= sln1(t);
u1_eksak = sln2(t);
u2_eksak = sln3(t);
u3_eksak
% menghitung error
= abs(w(1, :)' - u1_eksak);
err_w1 = abs(w(2, :)' - u2_eksak);
err_w2 = abs(w(3, :)' - u3_eksak);
err_w3 = sum(err_w1); % norm L1 (taxicab/Manhattan)
err_w1_total = sum(err_w2); % norm L1 (taxicab/Manhattan)
err_w2_total = sum(err_w3); % norm L1 (taxicab/Manhattan)
err_w3_total
% menampilkan tabel, termasuk error
format long;
disp("Tabel aproksimasi w1,i, solusi eksak u1(t), dan error:");
, w(1, :)', u1_eksak, err_w1]
[tdisp("Tabel aproksimasi w2,i, solusi eksak u2(t), dan error:");
, w(2, :)', u2_eksak, err_w2]
[tdisp("Tabel aproksimasi w3,i, solusi eksak u3(t), dan error:");
, w(3, :)', u3_eksak, err_w3]
[tdisp("Error total (norm L1) untuk w1,i:");
disp(err_w1_total);
disp("Error total (norm L1) untuk w2,i:");
disp(err_w2_total);
disp("Error total (norm L1) untuk w3,i:");
disp(err_w3_total);
format;
figure;
hold on;
fplot(sln1, [a, b], 'r');
scatter(t, w(1, :), 'r'); % ambil baris pertama yaitu solusi u1
title("Solusi u1(t) atau y(t)");
legend("Solusi eksak", "w1,i (aproksimasi)");
legend('location', 'northwest');
figure;
hold on;
fplot(sln2, [a, b], 'g');
scatter(t, w(2, :), 'g'); % ambil baris kedua yaitu solusi u2
title("Solusi u2(t) atau y'(t)");
legend("Solusi eksak", "w2,i (aproksimasi)");
legend('location', 'northwest');
figure;
hold on;
fplot(sln3, [a, b], 'b');
scatter(t, w(3, :), 'b'); % ambil baris ketiga yaitu solusi u3
title("Solusi u3(t) atau y''(t)");
legend("Solusi eksak", "w3,i (aproksimasi)");
legend('location', 'northwest');
Tabel aproksimasi w1,i, solusi eksak u1(t), dan error:
ans =
1.000000000000000 0 0 0
1.100000000000000 0.116547765077132 0.116547953377741 0.000000188300609
1.200000000000000 0.272737593417178 0.272737913137213 0.000000319720036
1.300000000000000 0.479101055922200 0.479101624357037 0.000000568434836
1.400000000000000 0.746988331768006 0.746998073629463 0.000009741861457
1.500000000000000 1.088479331032411 1.088492594095847 0.000013263063436
1.600000000000001 1.516250804091531 1.516264730431065 0.000013926339534
1.700000000000001 2.043523756922286 2.043536416215900 0.000012659293614
1.800000000000001 2.684004508018369 2.684014851438298 0.000010343419929
1.900000000000001 3.451838703918476 3.451846252199066 0.000007548280589
2.000000000000001 4.361573101909957 4.361577799834785 0.000004697924828
Tabel aproksimasi w2,i, solusi eksak u2(t), dan error:
ans =
1.000000000000000 1.000000000000000 1.000000000000000 0
1.100000000000000 1.346897244698541 1.346898796867440 0.000001552168898
1.200000000000000 1.794476400848503 1.794479954480695 0.000003553632192
1.300000000000000 2.351739790653634 2.351745763551004 0.000005972897370
1.400000000000000 3.026328879302920 3.026307271933378 0.000021607369542
1.500000000000000 3.824765611199535 3.824727552609112 0.000038058590423
1.600000000000001 4.752808495899515 4.752761161714929 0.000047334184586
1.700000000000001 5.815576770936465 5.815525533513762 0.000051237422703
1.800000000000001 7.017677812981450 7.017626495142349 0.000051317839101
1.900000000000001 8.363300595016490 8.363252082824820 0.000048512191670
2.000000000000001 9.856287435428921 9.856243969447302 0.000043465981619
Tabel aproksimasi w3,i, solusi eksak u3(t), dan error:
ans =
Columns 1 through 3:
1.000000000000000e+00 3.000000000000000e+00 3.000000000000000e+00
1.100000000000000e+00 3.956010469157951e+00 3.956018195368995e+00
1.200000000000000e+00 5.010512494112985e+00 5.010526645695958e+00
1.300000000000000e+00 6.147399365577646e+00 6.147418750933507e+00
1.400000000000000e+00 7.354687175512593e+00 7.354710775454516e+00
1.500000000000000e+00 8.623223151179934e+00 8.623257706687671e+00
1.600000000000001e+00 9.945876374658745e+00 9.945922939388453e+00
1.700000000000001e+00 1.131696670232371e+01 1.131702545393904e+01
1.800000000000001e+00 1.273189177401384e+01 1.273196207929798e+01
1.900000000000001e+00 1.418686238954817e+01 1.418694334605300e+01
2.000000000000001e+00 1.567871426475001e+01 1.567880489040572e+01
Column 4:
0
7.726211044278841e-06
1.415158297302099e-05
1.938535586099022e-05
2.359994192246972e-05
3.455550773701077e-05
4.656472970765435e-05
5.875161532742368e-05
7.030528413842774e-05
8.095650483497252e-05
9.062565571049674e-05
Error total (norm L1) untuk w1,i:
7.325663886766087e-05
Error total (norm L1) untuk w2,i:
3.126122781038632e-04
Error total (norm L1) untuk w3,i:
4.466223892567456e-04