#pragma hdrstop
#pragma argsused
#include <stdio.h>
#include <math.h>
#include <conio.h>
double f1(double x){ //Первая функция (один параметр типа double и результат double)
return 1/(1.2*tan(x)+sqrt(x+1))-x;
}
double f2(double x){ //Вторая функция (один параметр типа double и результат double)
double z = (sin(x)+cos(x));
return z*z/pow(33.5,2./3)+sqrt(3./7)-x;
}
double func1(double x){ //Преобразованная для метода бисекции первая функция
return (1/(2*(1.2*tan(x)+sqrt(x+1)))+(x/2)); //1/2*f1(x)+x
}
double func2(double x){ //Преобразованная для метода итераций вторая функция
return f2(x)+x;
}
/* //Метод деления отрезка пополам
double bisekcii(double a,double b,double e,int i,int j, int N, double (*f)(double)){
double c;
i=0;//Счетчик итераций
e=1/pow(10,j);//Погрешность
while(fabs(b-a)>=e){ //продолжать поиск корня пока не достинута заданная точность
c=(a+b)/2; //делим промежуток пополам
if((f(a))*(f(c))<=0) //в зависимости от знака
b=c; //двигаемся к одному
else
a=c; //или другому концу промежутка
i++;
}
printf("%14.*lf|",j,e); //Погрешность выводится с точностью j знаков после .
printf("%4d|", i); //Число итераций метод I
return (a+b)/2.0; //Вернуть найденный корень уравнения
} */
double bisekcii(double a, double b, double e, int& i,int& j, double (*f)(double))
{
i = 0;
e=1/pow(10,j);
double fa = f(a), fb = f(b);
while(b-a >= e)
{
double c=(a+b)/2;
double fc = f(c);
if (fa*fc <= 0)
b=c;
else
a=c;
i++;
}
printf("%14.*lf|",j,e); //Погрешность выводится с точностью j знаков после .
printf("%4d|", i); //Число итераций метод I
return (a+b)/2.0;
}
double iteracii(double a, double e, int& i,int& j, double (*f)(double)){
i=0;
double b = f(a);
e=1/pow(10,j);
while(fabs(b-a) >=e ) {
a = b;
b = f(a);
i++;
}
printf("%5d|", i); //Число итераций
return b;
}
int main(){
int k,l,i,j,N;
int flg2=1,flg3=1, flg1=1;
double a,b,e,x1,x2,x3,x4;
printf("В таблице:\n I - кол-во итераций цикла при методе бисекций \n");
printf("II - кол-во итераций цикла при методе простых итераций \n");
printf("Введите число N: ");
while (flg1) {
while (!fflush(stdin) && !scanf("%d", &N))
printf("N - не число. Повторите ввод: ");
if (N < 1 || N > 10){
printf("N выходит за границы допустимого диапазона. Введите N[1...10]: ");
scanf("%d", &N);
break;
}
else{
flg1 = 0;
}
}
printf("Введите число a: ");
while (flg2) {
while (!fflush(stdin) && !scanf("%lf", &a))
printf("a - не число. Повторите ввод: ");
if ((a>=2)||(a<=0)) {
printf("a за пределами диапазона 0<a<2. Введите a:");
scanf("%lf",&a);
break;
}
else{
flg2 = 0;
}
}
printf("Введите число b: ");
while (flg3) {
while (!fflush(stdin) && !scanf("%lf", &b))
printf("b - не число. Повторите ввод: ");
if ((b>=2)||(b<=0)||(b<=a)) {
printf("b за пределами диапазона 0<a<b<2. Введите b: ");
scanf("%lf",&b);
break;
}
else{
flg3 = 0;
}
}
printf(" \n");
if (f1(a)*f1(b)>0) {
printf("У f1 корня на отрезке AB нет\n");
}
else{
printf("Для первой функции:\n");
printf(" Погрешность | I | II | Корень I | Корень II \n");
for (j = 1; j <= N; j++){
e=1/pow(10,j);
x1=bisekcii(a,b,e,i,j,f1); //Поиск корня f1 на интервале (a;b) первым методом
x3=iteracii(a,e,i,j,func1); //Поиск корня f1 на интервале (a;b) вторым методом
printf("%14.*lf|%14.*lf\n",j,x1,j,x3);
}
printf("\n");
}
if(f2(a)*f2(b)>0) {
printf("У f2 корня на отрезке AB нет\n");
}
else{
printf("Для второй функции:\n");
printf(" Погрешность | I | II | Корень I | Корень II \n");
for (j = 1; j <=N; j++) {
e=1/pow(10,j);
x2=bisekcii(a,b,e,i,j,f2); //Поиск корня f2 на интервале (a;b) первым методом
x4=iteracii(a,e,i,j,func2); //Поиск корня f2 на интервале (a;b) вторым методом
printf("%14.*lf|%14.*lf\n",j,x2,j,x4);
}
printf("\n");
}
printf("Press any key to exit");
getch();
return (0);
}