Académique Documents
Professionnel Documents
Culture Documents
- AKN – 13 -
DIFERENSIASI NUMERIK
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.
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
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.