Vous êtes sur la page 1sur 9

Laporan Akhir Praktikum

Algoritma dan Komputasi Numerik

- AKN – 13 -
DIFERENSIASI NUMERIK

Nama : Adi Sugiarto


NPM : 140310160037
Hari/Tanggal : Rabu, 31 Mei 2017
Waktu : 15.00 – 17.00 WIB
Asisten : A. M. Al-Fikri

LABORATORIUM KOMPUTER
DEPARTEMEN FISIKA
FAKULTAS MATEMATIKA DAN ILMU PENGETAHUAN ALAM
UNIVERSITAS PADJADJARAN
2017
1

V. Tugas Praktikum
5.1 Diferensiasi Numerik
a. Listing Program
#include <stdio.h>
#include <math.h>
float f(float z)
{
float fz;
fz = pow(sin(3-2*z),4);
//fz=(sin(3*z))/(z*cos(2*z));
return fz;
}
main ()
{
float x, h[100], F[100], B[100], C[100], EF[100], EB[100], EC[100];
int n, i;
printf ("\n----- DIFERENSIASI NUMERIK -----\n");
printf ("\nnilai x\t : "); scanf ("%f", &x);
printf ("banyak h : "); scanf ("%d", &n);
for (i=0;i<n;i++)
{
printf ("masukkan nilai h[%d] : ", i+1); scanf ("%f", &h[i]);
}
for (i=0;i<n;i++)
{
F[i]=(f(x+h[i])-f(x))/(h[i]);
B[i]=(f(x)-f(x-h[i]))/(h[i]);
C[i]=(f(x+h[i])-f(x-h[i]))/(2*h[i]);
}
for (i=0;i<n;i++)
{
EF[i]=fabs((f(x+h[i]*2)-(2*f(x+h[i]))+f(x))/(2*h[i]));
EB[i]=fabs((f(x-h[i]*2)-(2*f(x-h[i]))+f(x))/(2*h[i]));
EC[i]=fabs((f(x+2*h[i])-(2*f(x+h[i]))+(2*f(x-h[i]))-f(x-
2*h[i]))/(12*h[i]));
}
printf ("\n-------------------------------------------------------
----------");
printf ("\nNo|\t h\t| F\t| Error\t| B\t| Error\t| C\t| Error
|\n");
printf ("---------------------------------------------------------
--------\n");
for (i=0;i<n;i++)
{
printf ("%d |\t%g\t|%.3f\t|%.5f|%.3f\t|%.5f|%.3f\t|%.5f|\n",
i+1, h[i], F[i], EF[i], B[i], EB[i], C[i], EC[i]);
}
printf ("---------------------------------------------------------
--------\n");

return 0;
}
2

b. Tampilan Program
• 𝑓(𝑥) = 𝑠𝑖𝑛4 (3 − 2𝑥)

sin(3𝑥)
• 𝑓(𝑥) = 𝑥 cos(2𝑥)

F = Forward Difference
B = Backward Difference
C = Central Difference
3

c. Analisis Program
Metode Beda hingga merupakan metode diferensial yang digunakan pada
program ini, dimana metode beda hingga terdiri dari metode Forward
Difference, Backward Difference, dan Central Difference. Untuk membuat
program ini digunakan header umum berupa <stdio.h> dan header untuk operasi
matematika yaitu <math.h>. Selanjutnya pembuatan fungsi dengan sintaks :
float f(float z)
{
float fz;
fz = pow(sin(3-2*z),4);
//fz=(sin(3*z))/(z*cos(2*z));
return fz;
}
Dibuat 2 fungsi seperti yang tertera pada modul, dimana salah satu fungsi
diperlakukan sebagai komentar, agar hanya 1 fungsi saja yang aktif. Kemudian
masuk pada fungsi utama dan pendeklarasian. Setelah pendeklarasian, dibuat
sintaks untuk menginput nilai x dan banyak h (jarak antara 2 titik data). Pada
program ini digunakan nilai x=1 dan h = {0.001;0.005;0.05;0.1;0.5}. Sehingga
untuk looping dilakukan pada h dan operasi yang berkaitan dengannya sebanyak
n = 5 kali.
Lalu setelah dibuat sintaks untuk menginput nilai h, maka masuk pada
proses perhitungan diferensial dengan sintaks :
for (i=0;i<n;i++)
{
F[i]=(f(x+h[i])-f(x))/(h[i]);
B[i]=(f(x)-f(x-h[i]))/(h[i]);
C[i]=(f(x+h[i])-f(x-h[i]))/(2*h[i]);
}
Struktur pengulangan berupa for () digunakan karena nilai h naik dengan selang
n+1 dengan F untuk forward difference, B untuk backward difference, dan C
untuk central difference.
Operasi terakhir adalah penentuan nilai error, dimana nilai error ini
merupakan turunan kedua dari fungsi tersebut. Hal ini didasarkan pada
penurunan rumus diferensial dengan metode grafik dan deret taylor yang saling
disubstitusikan hingga menghasilkan operasi sebagai berikut :
for (i=0;i<n;i++)
{
EF[i]=fabs((f(x+h[i]*2)-(2*f(x+h[i]))+f(x))/(2*h[i]));
4

EB[i]=fabs((f(x-h[i]*2)-(2*f(x-h[i]))+f(x))/(2*h[i]));
EC[i]=fabs((f(x+2*h[i])-(2*f(x+h[i]))+(2*f(x-h[i]))-f(x-
2*h[i]))/(12*h[i]));
}
Sintaks fabs () digunakan agar nilai error tidak bernilai negatif, dimana sintaks
ini berfungsi sebagai pemutlakan suatu nilai.
Kemudian jika ditinjau dari hasil program, nilai diferensial dengan error
terkecil terdapat pada operasi central difference baik pada fungsi (1) maupun
(2). Karena fungsi sinus dan cosinus merupakan fungsi yang memiliki puncak
atau fungsi parabola menjalar. Titik puncak atau titik balik memiliki gradien nol
( m = 0 ), sehingga metode diferensial numerik yang memenuhi adalah metode
central difference dimana dengan metode ini bisa ditarik garis singgung pada
titik tengah data yang merupakan titik puncak fungsi nya. Selain itu dapat
diperhatikan pula pada hasil program bahwa semakin kecil nilai h maka semakin
kecil errornya, begitupun sebaliknya. Ini dikarenkan semakin kecil jarak antar 2
titik (h) maka gradien atau garis singgung yang dapat ditarik antara 2 titik
tersebut akan lebih mendekati bentuk grafik/kurva fungsi sebenarnya.

VI. Tugas Akhir


1) Selidiki apa yang terjadi apabila step size h (intervalnya) berbeda !.
Semakin besar interval h maka semakin besar nilai errornya. Sedangkan
semakin kecil interval h maka semakin kecil pula errornya. Hai ini dikarenakan
apabila interval h kecil, maka garis singgung yang dapat ditarik antar 2 titik
data akan lebih mendekati bentuk kurva/grafik sebenarnya.

2) Sebuah mobil dengan massa melaju dengan kecepatan yang berubah-ubah.


Diperoleh data jarak yang ditempuh mobil terhadapa waktu sebagai berikut:

t (s) x (m)
0 0
0.1 2
0.25 2.8
5

0.38 3.5
0.56 4

Tentukan impuls yang terjadi yang dihasilkan mobil saat t = 0.25 dan t = 0.56
a. Listing Program
#include <stdio.h>
#include <math.h>
main()
{
float v[10],t[10],x[10],h[10],c[10],a[10],k[10],m=1200;
int i;
printf ("\n------- TUGAS AKHIR AKN 13 -------\n\n");
printf ("input data waktu (t sekon):\n");
for (i=0;i<5;i++)
{
printf ("Masukkan t[%d] : ", i+1); scanf ("%f", &t[i]);
}
printf ("\ninput data jarak (x meter):\n");
for (i=0;i<5;i++)
{
printf ("Masukkan x[%d] : ", i+1); scanf ("%f", &x[i]);
}
printf ("\ninput waktu data yang dicari :\n");
for (i=0;i<3;i++)
{
printf ("Masukkan t[%d] : ", i+1); scanf ("%f", &c[i]);
}
printf ("\Forward Difference\n");
h[0]=t[1]-c[0];
v[0]=(x[1]-x[0])/h[0];
a[0]=(x[2]-2*x[1]+x[0])/(h[0]*h[0]);
k[0]=a[0]*h[0];
printf ("t=%.0f\nMomentum = %.3f kg m/s\nGaya = %.3f N\nImpuls
= %.3f Ns\n",t[0],m*v[0],m*a[0],k[0]);
printf ("\nBackward Difference\n");
h[1]=c[2]-t[3];
v[1]=(x[4]-x[3])/h[1];
a[1]=(x[2]-2*x[3]+x[4])/(h[1]*h[1]);
k[1]=a[1]*h[1];
printf ("t = %.2f\nMomentum = %.3f kg m/s\nGaya = %.3f
N\nImpuls = %.3f Ns\n",c[2],m*v[1],m*a[1],k[1]);
printf ("\nCentral Difference\n");
v[2]=(2*c[1]-c[1]-t[3])*x[1]/((t[1]-t[2])*(t[1]-
t[3]))+(2*c[1]-t[1]-t[3])*x[2]/((t[2]-t[1])*(t[2]-
t[3]))+(2*c[1]-t[1]-t[2])*x[3]/((t[3]-t[2])*(t[3]-
t[1]));
a[2]=2*(x[1]/((t[1]-t[2])*(t[1]-t[3]))+x[2]/((t[2]-
t[1])*(t[2]-t[3]))+x[3]/((t[3]-t[1])*(t[3]-t[2])));
k[2]=a[2]*h[2];
printf ("t = %.2f\nMomentum = %.3f kg m/s\nGaya = %.3f
N\nImpuls = %.3f Ns\n",t[2],m*v[2],m*a[2],k[2]);
return 0;}
6

b. Tampilan Program

c. Analisis Program
Pada percobaan ini kita mengaplikasikan program deferensiasi numerik
untuk menghitung momentum, gaya dan impuls pada waktu tertentu. Metode
yang kita gunakan yaitu ada 3, maju , mundur dan pusat.
Pada listing program kita seperti biasa mendeklarasikan dahulu semua
variabel yang digunakan, varibel disini ada yang menggunakan array satu
dimensi karena data yang kita inputkan lebih dari satu. Setelah itu kita
menginputkan nilai-nilai waktu dan jarak sebanyak 5 kali, kemudian
menginputkan titik yang kita cari yaitu ada tiga titik jadi kita cukup melakukkan
pengulangan tiga kali (t-1, t0 dan t1). Setelah itu langsung melakukkan proses
dengan rumus selisih maju, selisih mundur dan selisih pusat. Untuk yang selisih
pusat disini rumusnya menggunakan lagrange karena nilai intervalnya berbeda.
7

Dari tampilan diatas kita mendapatkan nilai momentum, gaya dan


impulsnya. Dimana pada saat t=0 itu menggunakan rumus selisih maju dan nilai
momentum, gaya, dan impulsnya lebih besar dari ketiga metode. Pada saat
t=0.56 kita menggunakan rumus selisih mundur dan dipatkan nilai seperti di atas,
nilai momentumnya menjadi paling kecil diantara tiga metode. Pada saat t=0.25
kita menggunakan rumus lagrange karena intervalnya berbeda sehingga
didapatkan nilai seperti pada tampilan.

3) Dalam kondisi seperti apa setiap metode dapat digunakan?


Metode maju dapat digunakan jika tidak ada data atau titik sebelumnya
contohnya pada soal nomor 2, dimana jika untuk mencari t=0 maka kita
menggunakan metode maju karena tidak ada data sebelum t=0.
Metode mundur kebalikan dari metode maju yaitu tidak ada data atau titik
setelahnya. Bisa kita lihat contohnya pada soal no.2 yaitu kita ingin mencari nilai
pada saat t=0.56 maka kita gunakan metode mundur karena data setelah t=0.56
tidak ada.
Metode central pada metode ini digunakan jika data atau titik diketahui sebelum
dan sesudahnya. Contohnya soal no.2 yaitu kita mencari pada saat t=0.25 karena
data sebelum dan sesudah t=0.25 ada maka kita bisa menggunakan metode
central. Syarat untuk menggunakan ketiga metode diatas yaitu intervalnya harus
sama.

4) Bandingkan hasil yang diperoleh dari semua metode yang digunakan untuk
mencari nilai turunan !
8

Melalui tampilan program ini, dapat diketahui bahwa metode Central Difference
memiliki error yang lebih kecil dibandingkan metode beda hingga lainnya.

VII. Kesimpulan
Metode diferensial numerik terbagi menjadi 3, yaitu forward difference,
backward difference dan central difference. Dimana metode central difference
merupakan metode dengan error terkecil dan agar nilai diferensial mendekati nilai
sebenarnya, maka digunakan h (jarak antara 2 titik data) yang kecil pula.