Добавил:
Upload
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <fstream.h>
extern double F(double);
extern double Fi(double);
double BISECT(double Left,double Right,double Eps,int &N)
{
double E = fabs(Eps)*2.0;
double FLeft = F(Left);
double FRight = F(Right);
double X = (Left+Right)/2.0;
double Y;
if (FLeft*FRight>0.0) {puts("ЌҐўҐа®Ґ § ¤ ЁҐ ЁвҐаў « \n");exit(1);}
if (Eps<=0.0) {puts("ЌҐўҐа®Ґ § ¤ ЁҐ в®з®бвЁ\n");exit(1);}
N=0;
if (FLeft==0.0) return Left;
if (FRight==0.0) return Right;
while ((Right-Left)>=E)
{
N++;
X = 0.5*(Right + Left); /* ўлзЁб«ҐЁҐ бҐаҐ¤Ёл ®в१Є */
Y = F(X);
if (Y == 0.0) return (X);
if (Y*FLeft < 0.0)
Right=X;
else
{ Left=X; FLeft=Y; }
};
return(X);
}
double Round (double X,double Delta)
{
if (Delta<=1E-9) {puts("ЌҐўҐа®Ґ § ¤ ЁҐ в®з®бвЁ ®ЄагЈ«ҐЁп\n");exit(1);}
if (X>0.0) return (Delta*(long((X/Delta)+0.5)));
else return (Delta*(long((X/Delta)-0.5)));
}
double ITER(double X0,double Eps,int &N, ofstream &f_out)
{
if (Eps<=0.0) {puts("ЌҐўҐа®Ґ § ¤ ЁҐ в®з®бвЁ\n");exit (1);}
double X1=Fi(X0);
double X2=Fi(X1);
extern double delta;
double x_true(0.437906525773);
N = 2;
f_out<<"Delta\t"<<delta<<"\nEps\t"<<Eps<<endl
<<"N\t"<<"X(n-2)\t\tX(n-1)\t\tX(n)\t\t|(X(n)-X(n-1)|\t\t|(X(n)-x)/(X(n)-X(n-1))|\n";
f_out << N << "\t" << X0 << "\t" << X1 << "\t" << X2 << "\t" << fabs(X2-X1) << "\t\t";
if ((X2-X1)!=0)
f_out << fabs((X2-x_true)/(X2-X1)) << "\n";
else
f_out << "X(n)=X(n-1)=X" << "\n";
while( fabs(X1-X2)>Eps/*(X1 - X2)*(X1 - X2) > fabs((2*X1-X0-X2)*Eps)*/ )
{
X0 = X1;
X1 = X2;
X2 = Fi(X1);
N++;
f_out << N << "\t" << X0 << "\t" << X1 << "\t" << X2 << "\t" << fabs(X2-X1) << "\t\t";
if ((X2-X1)!=0)
f_out << fabs((X2-x_true)/(X2-X1)) << "\n";
else
f_out << "X(n)=X(n-1)=X" << "\n";
}
f_out<<"/------------------------------/\n";
return(X2);
}
double NEWTON (double X,double Eps,int &N, ofstream &f_out)
{
extern double F1 (double);
double Y,Y1,DX;
double x_pred,x_true(0.437906525773);
extern double delta;
f_out<<"Delta\t"<<delta<<"\nEps\t"<<Eps<<endl
<<"N\t"<<"X(i-1)\t\tX(i)\t\t|X(i)-X(i-1)|\t|(X(i)-X)/(X(i)-X(i-1))|\n";
N=0;
do
{
x_pred=X;
Y = F(X);
if (Y==0.0) {f_out<<"/------------------------------/\n"; return (X);}
Y1 = F1(X);
if (Y1==0.0) {puts("Џа®Ё§ў®¤ п ®Ўа вЁ« бм ў ®«м\n");exit(1);}
DX=Y/Y1; X=X-DX;
N++;
f_out << N << "\t" << x_pred << "\t" << X << "\t" << fabs(X-x_pred) << "\t" << fabs((X-x_true)/(X-x_pred)) << "\n";
}
while (fabs(DX)>Eps);
f_out<<"/------------------------------/\n";
return (X);
}
double HORDA(double Left,double Right,double Eps,int &N, ofstream &f_out)
{
double FLeft = F(Left);
double FRight = F(Right);
double X,Y;
double x_pred,x_true(0.437906525773);
extern double delta;
if (FLeft*FRight>0.0) {puts("ЌҐўҐа®Ґ § ¤ ЁҐ ЁвҐаў « \n");exit(1);}
if (Eps<=0.0) {puts("ЌҐўҐа®Ґ § ¤ ЁҐ в®з®бвЁ\n");exit(1);}
N=0;
if (FLeft==0.0) return Left;
if (FRight==0.0) return Right;
f_out<<"Delta\t"<<delta<<"\nEps\t"<<Eps<<endl
<<"N\t"<<"X(i-1)\t\tX(i)\t\t|X(i)-X(i-1)|\t|(X(i)-X)/(X(i-1)-X)|\n";
x_pred=Right;
do
{
N++;
X = Left-(Right-Left)*FLeft/(FRight-FLeft);
Y = F(X);
/*if ((delta<0.00001)&&(Eps<0.00001))
{*/
f_out << N << "\t" << x_pred << "\t" << X << "\t" << fabs(X-x_pred) << "\t" << fabs((X-x_true)/(x_pred-x_true)) << "\n";
/*}*/
x_pred=X;
if (Y == 0.0) {f_out<<"/------------------------------/\n"; return (X);}
if (Y*FLeft < 0.0)
{ Right=X; FRight=Y; }
else
{ Left=X; FLeft=Y; }
}
while ( fabs(Y) >= Eps );
f_out<<"/------------------------------/\n";
return(X);
}