SELAMAT DATANG DI BLOG FAUZA KHAIR MAYA, DAPATKAN PENGETAHUAN BARU DAN SHARING ILMU

Kamis, 23 Juni 2011

program C++ untuk penyelesaian soal Chapra metode numerik dengan beberapa metode2

#include <iostream>
#include <cmath>
#include <stdlib.h>
#include <conio.h>
#include <stdio.h>
#include <math.h>
#define e 2.718281828
#define error_limit 0.00000000000001
using namespace std;

void X_baru (float& x)
{
x=(pow(e,-x));
}

void Y_baru (float& x)
{
x=x-(pow(e,-x)-x)/(-1*pow(e,x)-1);
}
float f(float x)
{
    return (pow(e,-x)-x);
}

int main ()
{
float galat,d,a,as;
float galat_2,b,bs;
FILE *regula_falsi, *regula_x;
double fx1, fx2, fx3,x1, x2, x3,x10, x20, f1f2,x, dx, y1, y2, dy;
int k;
char lagi, belum;
FILE *stream;
int i, j,y[100];

int pilihan;
cout<<"==============  Program mencari akar persamaan Y=e^-X-X ================"<<endl;
cout<<"=================        macam macam metode     ========================="<<endl;
cout<<endl;


cout<<"masukkan pilihan anda"<<endl;

cout<<"1. untuk metode iterasi titik sederhana"<<endl;
cout<<"2. untuk metode newton raphson"<<endl;
cout<<"3. untuk metode grafik biasa tanpa iterasi"<<endl;
cout<<"4. untuk metode grafik dengan iterasi"<<endl;
cout<<"5. untuk metode regulasi false"<<endl;
cout<<"6. untuk metode bagi dua"<<endl;
cout<<"7. untuk metode secant"<<endl;
lagi :
cout<<"pilihan anda : ";
cin>>pilihan;

switch (pilihan)
{

case 1:
{
cout<<"========================================"<<endl;
cout<<"Program mencari akar persamaan dengan   "<<endl;
cout<<"Metoda iterasi titik sederhana Y=2e^X-X-3 "<<endl;
cout<<"========================================"<<endl;
cout<<endl<<endl;
cout<<"masukkan nilai awal (Xo) = ";
cin>>a;
cout<<endl;
cout<<"Masukkan batas toleransi e =";
cin>>d;
cout<<endl;
cout<<"Tabulasi data : "<<endl;
cout<<"|-------------|"<<endl;
cout<<"| i |    Xi   |"<<endl;
cout<<"|-------------|"<<endl;

do
{
static i = 1;
as=a;
X_baru (a);
galat = fabs (a - as);
cout.setf(ios::left|ios::showpoint);
    cout<<"|";
    cout.width(3);
    cout<<i;
    cout<<"|";
    cout.width(9);
    cout<<a;
    cout<<"|";
    i = i + 1;
    cout<<endl;
} while (galat > d);

cout<<"|------------|"<<endl<<endl;
cout<<"Maka solusi akar persamaannya adalah : "<<a<<endl;
cout<<"cari dengan metode lain"<<endl;
}

break;

case 2:
{
cout<<"========================================"<<endl;
cout<<"Program mencari akar persamaan dengan   "<<endl;
cout<<"Metoda Newton - Raphson Y=2e^X-X-3 "<<endl;
cout<<"========================================"<<endl;
cout<<endl<<endl;
cout<<"masukkan nilai awal (Xo) =";
cin>>b;
cout<<endl;
cout<<"Masukkan batas toleransi e =";
cin>>d;
cout<<endl;
cout<<"Tabulasi data : "<<endl;
cout<<"|-------------|"<<endl;
cout<<"| i |    Xi   |"<<endl;
cout<<"|-------------|"<<endl;

do
{
static i = 1;
bs=b;
Y_baru (b);
galat_2 = fabs (b - bs);
cout.setf(ios::left|ios::showpoint);
    cout<<"|";
    cout.width(3);
    cout<<i;
    cout<<"|";
    cout.width(9);
    cout<<b;
    cout<<"|";
    i = i + 1;
    cout<<endl;
} while (galat_2 > d);

cout<<"|------------|"<<endl<<endl;
cout<<"Maka solusi akar persamaannya adalah : "<<b<<endl;
cout<<"cari dengan metode lain"<<endl;
}

break;

case 3:
{
    cout<<"metode grafik sederhana "<<endl;
    cout<<"masukkan batas bawah anda :";
    cin>>i;
    cout<<"masukkan batas atas anda  :";
    cin>>j;
    for (int x=i;x<=j;x++)
    {
        y[x]=pow(e,x)-x;
    }
    cout<<"hasil plot grafik"<<endl;
    for ( x=i;x<=j;x++)
    {
        cout<<"y"<<"["<<x<<"]="<<y[x]<<"\t";
        cout<<"\n";
    }
cout<<"nilai akar anda berada saat nilai fungsi sama dengan nol "<<endl;
cout<<"atau disekitar x saat nilai fungsinya mendekati nol"<<endl;
cout<<"cari dengan metode lain"<<endl;
}
break;

case 4:
{
stream = fopen("grafik.txt", "w+");
cout << "Metode Grafik\n";
cout << "-------------\n\n";
cout<<"//persamaan awal Y=e^-X-X"<<endl;
cout<<"//y1 = e^-x, y2 = x"<<endl;
cout << "Maksimum Iterasi = ";
cin >>j;
cout<< "Berapa Nilai Awal x = ";
cin >> x;
cout<< "Berapa Nilai Interval x = ";
cin >> dx;

printf("\n\t------------------------------------------------\n");
printf("\tIterasi ke-\tx\ty1\ty2\tSelisih\n");
printf("\t------------------------------------------------\n\n");
fprintf(stream, "\n\t------------------------------------------------\n");
fprintf(stream, "\tIterasi ke-\tx\ty1\ty2\tSelisih\n");
fprintf(stream, "\t------------------------------------------------\n\n");
for(i = 0; i < j; i++)
{
y1 = pow(e,-x);
y2 = x;
dy = y1 - y2;
printf("\t\t%d\t%.2f\t%.2f\t%.2f\t%.2f\n", i+1, x, y1, y2, dy);
fprintf(stream,"\t\t%d\t%.2f\t%.2f\t%.2f\t%.2f\n", i+1, x, y1, y2, dy);
x += dx;
}
printf("\t------------------------------------------------\n\n");
fprintf(stream, "\t------------------------------------------------\n\n");
fclose(stream);
cout<<"ketika selisih nya bernilai nol maka nilai x tersebut adalah akarnya "<<endl;
cout<<"atau sekitar x ketika fungsi mendekati nol"<<endl;
cout<<"cari dengan metode lain"<<endl;
    }
break;

case 5:
    {
do
{
j = 0;
regula_falsi = fopen("regula_falsi.txt", "w+");
regula_x = fopen("cross_regula.txt", "w+");
do
{
cout << "Metode Regula-Falsi\n";
cout << "===================\n\n";
cout<<"//Persamaan utama dan persamaan untuk mencari titik potongnya"<<endl;
cout << "Y=e^X-X\n\n";
cout << "y1 = e^-x dan y2 = x\n\n";
cout << "Mencari Titik Potong terdekat\n";
cout << "-----------------------------\n\n";
cout << "Berapa Nilai awal x = ";
cin >> x;
cout << "\nBerapa Nilai Interval x = ";
cin >> dx;
cout << "\nBerapa kali Iterasi = ";
cin >> k;
printf("\n\t-------------------------------------------------\n");
printf("\tIterasi ke-\tx\ty1\ty2\tselisih\n");
printf("\t-------------------------------------------------\n\n");
fprintf(regula_x,"\n\t-------------------------------------------------\n");
fprintf(regula_x,"\tIterasi ke-\tx\ty1\ty2\tselisih\n");
fprintf(regula_x,"\t-------------------------------------------------\n\n");
for (i = 0; i < k; i++)
{
y1 = pow(e,-x);
y2 = x;
dy = y1 - y2;
printf("\t\t%d\t%.1f\t%.2f\t%.2f\t%.2f\n", i+1, x, y1, y2, dy);
fprintf(regula_x, "\t\t%d\t%.1f\t%.2f\t%.2f\t%.2f\n", i+1, x, y1,y2,dy);
x += dx;
}
printf("\n\t-------------------------------------------------\n\n");
fprintf(regula_x, "\t-------------------------------------------------\n\n");
fclose(regula_x);
cout << "\nApakah Titik Potong telah ditemukan (y/t) ? ";
cin >> belum;
}while(belum != 'y');
cout << "\nMencari Titik Potong sebenarnya\n";
cout<<"catatan : saat selisih sama dengan nol maka nilai x itulah akarnya "<<endl;
cout << "===============================\n\n";
cout << "Masukkan Nilai x1 = ";
cin >> x1;
x10 = x1;
fx1 = pow(e,-x1) -x1;
do
{
cout << "\nMasukkan Nilai x2 = ";
cin >> x2;
fx2 = pow(e,-x2) -x2;
x20 = x2;
f1f2 = fx1*fx2;
}while(f1f2 >= 0.0);
printf("\n----------------------------------------------------------------------------\n");
printf("Iterasi ke-\tx3\tfx3\t\tfx3 (16 digit) Error Aproksimasi\n");
printf("----------------------------------------------------------------------------\n\n");
fprintf(regula_falsi,"\n----------------------------------------------------------------------------\n");
fprintf(regula_falsi,"Iterasi ke-\tx3\tfx3\t\tfx3 (16 digit) ErrorAproksimasi\n");
fprintf(regula_falsi, "----------------------------------------------------------------------------\n\n");
do
{
j++;
x3 = (x1*fx2 - x2*fx1)/(fx2 - fx1);
fx3 = pow(e,-x3) -x3;
printf("\t%d\t%.3f\t%.6f\t%.16f\n", j, x3, fx3, fabs(fx3));
fprintf(regula_falsi,"\t%d\t%.3f\t%.6f\t%.16f\n", j, x3, fx3,fabs(fx3));
if(fx1*fx3 < 0)
{
x2 = x3;
fx2 = fx3;
}
else
{
x1 = x3;
fx1 = fx3;
}
}while(fabs(fx3) > error_limit);
printf("\n----------------------------------------------------------------------------\n");
fprintf(regula_falsi,"\n----------------------------------------------------------------------------");
printf("\n\nDengan Nilai awal x1 = %.2f dan x2 = %.2f", x10, x20);
printf("\n\nDiperoleh Akar Persamaan x = %.3f", x3);
printf("\n\nDengan Error sebesar = %.16f", fabs(fx3));
fprintf(regula_falsi,"\n\nDengan Nilai awal x1 = %.2f dan x2 = %.2f", x10,x20);
fprintf(regula_falsi,"\n\nDiperoleh Akar Persamaan x = %.3f", x3);
fprintf(regula_falsi,"\n\nDengan Error sebesar = %.16f", fabs(fx3));
fclose(regula_falsi);
cout << "\n\nTekan Enter untuk melanjutkan .........";
getch();
cout << "\n\nCoba lagi dengan x dan y berbeda (y/t) ? ";
cin >> lagi;
    }while(lagi != 't');}
break;

case 6:
{
float x0,x1,d;

    float xr,xr1,toleransi;
    int i;
    cout<<"\tPROGRAM NUMERIK METODE BAGI DUA"<<endl;
    cout<<endl;
    cout<<"\tpersamaannya adalah : "<<endl;
    cout<<"\tf(x) = e^-x -x"<<endl;
    cout<<endl;
    cout<<"masukan tebakan pertama    =    ";
    cin>>x0;
    cout<<"masukan tebakan kedua    =    ";
    cin>>x1;
    cout<<"masukan batas toleransi    =    ";
    cin>>d;
    cout<<endl;

    cout<<"tabulasi data"<<endl;
    cout<<"-------------------------------------------------------------------"<<endl;

    cout<<"it      f(x0)        f(x1)       f(x0)*f(x1)      error        nilai akar          "<<endl;
    cout<<"-------------------------------------------------------------------"<<endl;
    i=0;
    if(f(x0)*f(x1)>0)
        cout<<"akar tidak terdapat pada rentang batas yg anda masukan"<<endl;
    else
    {       
    for(toleransi=0;toleransi<=d;toleransi++)
    {
    x_baru:
    i++;
        xr=(x0+x1)/2;
    if(f(xr)*f(x0)<0)
    {
        x1=xr;
        xr1=(x0+x1)/2;
    }
    else
    {
        x0=xr;
        xr1=(x0+x1)/2;
    }
    toleransi=fabs((xr1-xr)/xr1);
    cout.setf(ios::left|ios::showpoint);               
                cout.width(1);
                cout<<i<<"\t";
                cout.width(8);
                cout<<f(x0)<<"\t";       
                cout.width(13);
                cout<<f(x1);
                cout.width(13);
                cout<<f(x0)*f(x1);
                cout.width(10);
                cout<<toleransi<<"\t";
                cout.width(2);
                cout<<xr1;
                cout<<endl;
        if (toleransi<=d)
        {
            xr1=xr1;
            break;
        }
        else
        {
            goto x_baru;
        }
    }
    cout<<endl;
    cout<<"akar persamaan    =    "<<xr1;
    cout<<endl;
    cout<<"pada iterasi ke    =    "<<i;
    cout<<endl;   
    }
   

    }
break;
case 7:
    {
    int it;
    float xr,x0,toleransi;
    cout<<endl;
    cout<<"\tPROGRAM NUMERIK METODE SECANT "<<endl;
    cout<<endl;
    cout<<"persamaannya adalah f(x) = (e^-x -x)"<<endl;
    cout<<endl;
    cout<<"penyelesaiannya adalah :\n\n";
    cout<<"masukan batas pertama        =    ";
    cin>>x0;
    cout<<"masukan batas kedua        =    ";
    cin>>x1;
    cout<<"masukan batas tolerasi        =    ";
    cin>>d;   
    cout<<endl;
    cout<<endl;
    cout<<"tabulasi data"<<endl;
    cout<<"-------------------------------------------------------------------"<<endl;
    cout<<"iterasi      f(x0)        f(x1)        error        nilai akar          "<<endl;
    cout<<"-------------------------------------------------------------------"<<endl;
    it=0;   
    {
        for(toleransi=0;toleransi<=d;toleransi++)
        {
awal:
        {
            it++;
            xr = x1 - f(x1)*(x1 - x0)/(f(x1) - f(x0));
            toleransi=fabs((xr-x1)/xr);       
        {
            cout.setf(ios::left|ios::showpoint);           
                cout.width(1);
                cout<<it<<"\t";
                cout.width(8);
                cout<<f(x0)<<"\t";               
                cout.width(13);
                cout<<f(x1);
                cout.width(15);
                cout<<toleransi<<"\t";               
                cout.width(10);
                cout<<xr;               
                cout<<endl;
        }

            if(toleransi<=d)
            {
                xr=xr;
            }
            else
            {
                x0=x1;
                x1=xr;
                goto awal;
            }
            }
        }
    }
    cout<<endl;
    cout<<"akar persamaan \t\t\t=    "<<xr<<endl;
    cout<<"didapatkan pada iterasi ke \t=    "<<it<<endl;
    }
break;
default :
cout<<" pilihan anda salah";
}
cout<<endl;
cout<<endl;
goto lagi;
}

Tidak ada komentar:

Posting Komentar