Escolar Documentos
Profissional Documentos
Cultura Documentos
TUGAS PRAKTIKUM
Keterangan fungsi:
f1(x) = x2-3x-10
f2(x) = sin(x)
f3(x) = x3-3x-20
f4(x) = e-2x-4x
f5(x) = xe-x+cos(2x)
float f(float x)
{
return (pow(x,2)-(3*x)-10);
}
void main(void)
{
float a=-1,b=1,c=0;
int r=0;
if(f(a)*f(b)>0)
printf("\n\nSelang tidak memenuhi syarat cukup akar");
else
{
printf("\n\nr \ta \t\tb \t\tc \t\tf(a) \t\tf(b) \t\tf(c)
\t\t[a-b]");
do
{
c=(a+b)/2;
r++;
Analisa:
Pencarian akar menggunakan metode bisection ini pertama-tama di cek apakah
syarat keberadaan akar ada atau tidak. Jika ada maka dilajutkan proses lelaran dan
jika tidak (meskipun kemungkinan akar ada) proses tidak dilakukan dan program
langsung berakhir. Proses bisection adalah mengecek dimana selang [a,b] dipotong
di tengahnya oleh c sehingga nantinya di cek kembali selang yang memenuhi syarat
ada akar apakah di [a,c] ataukah di [c,b]. Di program diatas, nilai akar didapat jika
f(c) sudah mendekati nilai 0. Maka didapatlah nilai akar yaitu c. Dengan
menggunakan f1(x) dan batas [-1,1] ternyata tidak memenuhi syarat cukup
keberadaan akar sehingga tidak ada proses bisection untuk permasalahan tersebut.
float f(float x)
{
return (sin(x*M_PI/180));
}
void main(void)
{
float a=-45,b=45,c=0;
int r=0;
Analisa:
Pencarian akar sin(x) dengan selang tersebut ternyata sangat cepat, dengan hanya
membutuhkan 1 kali lelaran. Hal ini dikarenakan nilai bagi dua selang pas di angka
0 yang dimana nilai sin(0) adalah nol.
float f(float x)
{
return (pow(x,3)-(3*x)-20);
}
void main(void)
{
float a=1,b=4,c=0;
int r=0;
Analisa:
Dalam f3(x) ini terdapat nilai akarnya pada selang yang diberikan. Dengan 16x
proses iterasi barulah nilai absolut f(c) dianggap sudah mendekati nol dimana c
adalah nilai akarnya.
float f(float x)
{
return (pow(M_E,-2*x)-(4*x));
}
void main(void)
{
float a=0,b=1,c=0;
int r=0;
Analisa:
Terlihat untuk penyelesaian fungsi eksponensial ini lebar selang cukup cepat
mengecil dan galat relatifnya sudah kecil juga perubahan nilai c pun kecil akan
tetapi nilai f(c) nya masih besar. Baru pada iterasi ke 22 nilai f(c) sudah dianggap
kecil dan nilainya mendekati nol.
float f(float x)
{
return ((x*pow(M_E,-x))+(cos(2*x)));
}
void main(void)
{
float a=-1,b=1,c=0; //Selang lain [1,2] & [-1,1]
int r=0;
Analisa:
Fungsi f5(x) ini dicari akarnya dalam 3 selang dan hanya selang pertama yang
mengandung akar. Nilai akar berada pada titik 0.973 hanya didapat dengan selang
pertama padahal nilai akar itu juga berada pada selang ke tiga. Terliha di program
ini kekurangan metode bisection yang dimana pengecekan syarat cukup akar tidak
efektif untuk beberapa kasus dimana banyaknya akar dalam selang tersebut ada
genap. Dengan selang ke tiga, program menyimpulkan tidak memenuhi syarat
cukup akar padahal ada akarnya.
5.2.1 Program 1 - Solusi PNL f1(x) Metode Iterasi Titik Tetap
5.2.2 Program 2 - Solusi PNL f2(x) Metode Iterasi Titik Tetap
5.2.3 Program 3 - Solusi PNL f3(x) Metode Iterasi Titik Tetap
5.2.4 Program 4 - Solusi PNL f4(x) Metode Iterasi Titik Tetap
5.2.5 Program 5 - Solusi PNL f5(x) Metode Iterasi Titik Tetap
5.3.1 Program 1 - Solusi PNL f1(x) Metode Newton-Raphson
Listing Kode:
#include <stdio.h>
#include <math.h>
#define e 0.000001
float f0(float x)
{
return (pow(x,2)-(3*x)-10);
}
float f1(float x)
{
return ((2*x)-3);
}
void main(void)
{
float xo,xn,error=1;
int i=1;
printf("Masukkan nilai xo = ");scanf("%f",&xo);
printf("\nr\txo\txn\tgalat\n");
while(error>e)
{
xn=xo-(f0(xo)/f1(xo));
error=fabs(xn-xo);
printf("%d\t%.2f\t%.2f\t%.5f\n",i,xo,xn,error);
xo=xn;
i++;
}
printf("\nnilai akarnya sebesar %.5f\n",xn);
}
Tampilan:
Analisa:
Dengan metode ini fungsi diiterasi sebanyak 5 kali. Terlihat nilai galat langsung
turun secara drastis sehingga bisa dikatakan laju konvergensi metode ini cepat dari
pada sebelumnya.
5.3.2 Program 2 - Solusi PNL f2(x) Metode Newton-Raphson
Listing Kode:
#include <stdio.h>
#include <math.h>
#define e 0.000001
float f0(float x)
{
return (sin(x*M_PI/180));
}
float f1(float x)
{
return (cos(x*M_PI/180));
}
void main(void)
{
float xo,xn,error=1;
int i=1;
printf("Masukkan nilai xo = ");scanf("%f",&xo);
printf("\nr\txo\txn\tgalat\n");
while(error>e)
{
xn=xo-(f0(xo)/f1(xo));
error=fabs(xn-xo);
printf("%d\t%.2f\t%.2f\t%.5f\n",i,xo,xn,error);
xo=xn;
i++;
}
printf("\nnilai akarnya sebesar %.5f\n",xn);
}
Tampilan:
Analisa:
Untuk fungsi sinusoida ini didapat iterasi yang dilakukan sangat banyak mencapai
>600 dikarenakan untuk pendekatan akar ini sulit karena fungsi berubah ubah
secara periodik sehingga pendekatannya pun naik turun sebelum mencapai error
yang sudah cukup kecil.
5.3.3 Program 3 - Solusi PNL f3(x) Metode Newton-Raphson
Listing Kode:
#include <stdio.h>
#include <math.h>
#define e 0.000001
float f0(float x)
{
return (pow(x,3)-(3*x)-20);
}
float f1(float x)
{
return ((3*pow(x,2))-3);
}
void main(void)
{
float xo,xn,error=1;
int i=1;
printf("Masukkan nilai xo = ");scanf("%f",&xo);
printf("\nr\txo\txn\tgalat\n");
while(error>e)
{
xn=xo-(f0(xo)/f1(xo));
error=fabs(xn-xo);
printf("%d\t%.2f\t%.2f\t%.5f\n",i,xo,xn,error);
xo=xn;
i++;
}
printf("\nnilai akarnya sebesar %.5f\n",xn);
}
Tampilan:
Analisa:
Teramati bahwa nilai x0 dan xn untuk iterasi terakhir sudah tidak banyak perubahan
akan tetapi iterasi tetap dilanjutkan karena nilai selang errornya yang belum cukup
untuk menjadi syarat berhenti.
5.3.4 Program 4 - Solusi PNL f4(x) Metode Newton-Raphson
Listing Kode:
#include <stdio.h>
#include <math.h>
#define e 0.000001
float f0(float x)
{
return (pow(M_E,-2*x)-(4*x));
}
float f1(float x)
{
return ((0.5*pow(M_E,-2*x))-4);
}
void main(void)
{
float xo,xn,error=1;
int i=1;
printf("Masukkan nilai xo = ");scanf("%f",&xo);
printf("\nr\txo\txn\tgalat\n");
while(error>e)
{
xn=xo-(f0(xo)/f1(xo));
error=fabs(xn-xo);
printf("%d\t%.2f\t%.2f\t%.5f\n",i,xo,xn,error);
xo=xn;
i++;
}
printf("\nnilai akarnya sebesar %.5f\n",xn);
}
Tampilan:
Analisa:
Sama seperti kasus sebelumnya, nilai x0 dan xn sudah tidak banyak berubah tetapi
syarat berhenti iterasi yang didefinisikan sebelumnya belum tercapai sehingga
perhitungan tetap dilakukan
5.3.5 Program 5 - Solusi PNL f5(x) Metode Newton-Raphson
Listing Kode:
#include <stdio.h>
#include <math.h>
#define e 0.000001
float f0(float x)
{
return ((x*pow(M_E,-x))+(cos(2*x)));
}
float f1(float x)
{
return ((-x*pow(M_E,-x))-(2*sin(2*x)));
}
void main(void)
{
float xo,xn,error=1;
int i=1;
printf("Masukkan nilai xo = ");scanf("%f",&xo);
printf("\nr\txo\txn\tgalat\n");
while(error>e)
{
xn=xo-(f0(xo)/f1(xo));
error=fabs(xn-xo);
printf("%d\t%.2f\t%.2f\t%.5f\n",i,xo,xn,error);
xo=xn;
i++;
}
printf("\nnilai akarnya sebesar %.5f\n",xn);
}
Tampilan:
Analisa:
Nilai akar campuran fungsi eksponensial dengan sinusoid ini didapat dengan cepat
yaitu 5 kali iterasi dengan secara kasar nilai akar bisa ditarik sampai iterasi ke 3
karena nilai nya sudah mendekati. Akan tetapi nilai batas error yang terdefinisi
cukup kecil sehingga perlu di iterasi kembali.
VI. TUGAS AKHIR
6.1.1 Program 1 - Solusi PNL f1(x) Metode Secant
Listing Kode:
#include <stdio.h>
#include <math.h>
#define e 0.000001
float f(float x)
{
return (pow(x,2)-(3*x)-10);
}
void main(void)
{
float xo,x1,xn,error=1;
int i=1;
while(error>e)
{
xn=x1-((f(x1)*(x1-xo))/(f(x1)-f(xo)));
error=fabs(xn-x1);
printf("%d\t%.2lf\t%.2lf\t%.2f\t%.5f\n",i,xo,x1,xn,error);
xo=x1;
x1=xn;
i++;
}
Tampilan:
6.1.2 Program 2 - Solusi PNL f2(x) Metode Secant
Listing Kode:
#include <stdio.h>
#include <math.h>
#define e 0.000001
float f(float x)
{
return (sin(x*M_PI/180));
}
void main(void)
{
float xo,x1,xn,error=1;
int i=1;
while(error>e)
{
xn=x1-((f(x1)*(x1-xo))/(f(x1)-f(xo)));
error=fabs(xn-x1);
printf("%d\t%.2lf\t%.2lf\t%.2f\t%.5f\n",i,xo,x1,xn,error);
xo=x1;
x1=xn;
i++;
}
Tampilan:
6.1.3 Program 3 - Solusi PNL f3(x) Metode Secant
Listing Kode:
#include <stdio.h>
#include <math.h>
#define e 0.000001
float f(float x)
{
return (pow(x,3)-(3*x)-20);
}
void main(void)
{
float xo,x1,xn,error=1;
int i=1;
while(error>e)
{
xn=x1-((f(x1)*(x1-xo))/(f(x1)-f(xo)));
error=fabs(xn-x1);
printf("%d\t%.2lf\t%.2lf\t%.2f\t%.5f\n",i,xo,x1,xn,error);
xo=x1;
x1=xn;
i++;
}
Tampilan:
6.1.4 Program 4 - Solusi PNL f4(x) Metode Secant
Listing Kode:
#include <stdio.h>
#include <math.h>
#define e 0.000001
float f(float x)
{
return (pow(M_E,-2*x)-(4*x));
}
void main(void)
{
float xo,x1,xn,error=1;
int i=1;
while(error>e)
{
xn=x1-((f(x1)*(x1-xo))/(f(x1)-f(xo)));
error=fabs(xn-x1);
printf("%d\t%.2lf\t%.2lf\t%.2f\t%.5f\n",i,xo,x1,xn,error);
xo=x1;
x1=xn;
i++;
}
Tampilan:
6.1.5 Program 5 - Solusi PNL f5(x) Metode Secant
Listing Kode:
#include <stdio.h>
#include <math.h>
#define e 0.000001
float f(float x)
{
return ((x*pow(M_E,-x))+(cos(2*x)));
}
void main(void)
{
float xo,x1,xn,error=1;
int i=1;
while(error>e)
{
xn=x1-((f(x1)*(x1-xo))/(f(x1)-f(xo)));
error=fabs(xn-x1);
printf("%d\t%.2lf\t%.2lf\t%.2f\t%.5f\n",i,xo,x1,xn,error);
xo=x1;
x1=xn;
i++;
}
Tampilan:
6.2.1 Program 1 - Solusi PNL f1(x) Metode Regulasi Falsi
Listing Kode:
#include <stdio.h>
#include <math.h>
#define e 0.000001
float f(float x)
{
return (pow(x,2)-(3*x)-10);
}
void main(void)
{
float xo,x1,xn,error=1;
int i=1;
while(error>e)
{
xn=x1-((f(x1)*(x1-xo))/(f(x1)-f(xo)));
error=fabs(xn-x1);
printf("%d\t%.2lf\t%.2lf\t%.2f\t%.5f\n",i,xo,x1,xn,error);
if(f(x0)*f(xn)<0)
x1=xn;
else
x0=xn;
i++;
}
float f(float x)
{
return (sin(x*M_PI/180));
}
void main(void)
{
float xo,x1,xn,error=1;
int i=1;
while(error>e)
{
xn=x1-((f(x1)*(x1-xo))/(f(x1)-f(xo)));
error=fabs(xn-x1);
printf("%d\t%.2lf\t%.2lf\t%.2f\t%.5f\n",i,xo,x1,xn,error);
if(f(x0)*f(xn)<0)
x1=xn;
else
x0=xn;
i++;
}
float f(float x)
{
return (pow(x,3)-(3*x)-20);
}
void main(void)
{
float xo,x1,xn,error=1;
int i=1;
while(error>e)
{
xn=x1-((f(x1)*(x1-xo))/(f(x1)-f(xo)));
error=fabs(xn-x1);
printf("%d\t%.2lf\t%.2lf\t%.2f\t%.5f\n",i,xo,x1,xn,error);
if(f(x0)*f(xn)<0)
x1=xn;
else
x0=xn;
i++;
}
float f(float x)
{
return (pow(M_E,-2*x)-(4*x));
}
void main(void)
{
float xo,x1,xn,error=1;
int i=1;
while(error>e)
{
xn=x1-((f(x1)*(x1-xo))/(f(x1)-f(xo)));
error=fabs(xn-x1);
printf("%d\t%.2lf\t%.2lf\t%.2f\t%.5f\n",i,xo,x1,xn,error);
if(f(x0)*f(xn)<0)
x1=xn;
else
x0=xn;
i++;
}
float f(float x)
{
return ((x*pow(M_E,-x))+(cos(2*x)));
}
void main(void)
{
float xo,x1,xn,error=1;
int i=1;
while(error>e)
{
xn=x1-((f(x1)*(x1-xo))/(f(x1)-f(xo)));
error=fabs(xn-x1);
printf("%d\t%.2lf\t%.2lf\t%.2f\t%.5f\n",i,xo,x1,xn,error);
if(f(x0)*f(xn)<0)
x1=xn;
else
x0=xn;
i++;
}
Analisa:
Penyelesaian solusi akar yang diberikan menghasilkan tabel perbandingan seperti
yang ada di atas. Sebuah fungsi f(x) dalam kasus ini memiliki nilai akar yaitu 0.18.
Nilai akar tercepat didapatkan melalui metode Regula Falsi dan Secant. Kedua
metode ini laju konvergensinya cepat dan memiliki nilai error yang lebih kecil
dibandung metode lainnya. Baik regula falsi dan secant dalam proses pendekatan
akarnya memakai bantuan gradien dimana nilai f(a) dan f(b) untuk selang yang
dihitung turut dipertimbangkan sehingga laju konvergensinya cepat. Terlihat pula
dari urutan banyaknya iterasi, secara teoritik bisection memang metode yang lambat
dalam mencari akar karena hanya mengandalkan pembagian selang sama besar.
Selanjutnya sampai akhir adalah perbaikan dari metode metode sebelumnya
sehingga proses iterasi dan nilai error lebih sedikit.
VII. KESIMPULAN
Suatu persamaan non-linier yang kompleks dapat dicari solusinya berupa nilai akar
dengan bantuan numerik. Inti dari penyelesaian numerik dari pencarian akar suatu
fungsi ini adalah mencari nilai x yang mana nilai f(x)=0 atau mendekati nol.
Perbedaan tiap metode adalah seberapa tepat pencarian akar tersebut dilakukan dan
seberapa cepat hampiran nilai x tersebut didapat. Masing masing metode
mempunyai kelebihan dan kekurangan. Dalam hal ini metode terbuka lebih cepat
dan tepat dalam mencari solusi akar dari suatu persamaan tapi tidak selalu
konvergen dan begitu juga dengan metode tertutup, konvergen tetapi tidak selalu
cepat menemukan akarnya.