Нахождение корня тремя методами - C (СИ)
Формулировка задачи:
нужно создать программу нахождения корня нелинейного уравнения методами хорд,касательных,итераций в общем виде?)помогите пожалуйста
Решение задачи: «Нахождение корня тремя методами»
textual
Листинг программы
#include <stdio.h>
#include <conio.h>
#include <math.h>
int vibir;
float f(float x)
{ if(vibir==2)
return tan(0.55*x+0.1)-pow(x,2);
else
return pow(x, 3)-2* pow(x, 2)+7*x+3;
}
float f1(float x)
{ if(vibir==2)
return (0.55)/(pow(cos(0.55*x+0.1), 2))-2*x;
else
return (3*pow(x, 2)-4*x+7);
}
float f2(float x)
{ if(vibir==2)
return ((0.605*tan(0.55*x+0.1))/(pow(cos(0.55*x+0.1),2)))-2;
else
return (6*x-4);
}
int main()
{
int k=0;
float a, b, c, d, e, e1=0, z,x, x1, x2, y1, y2, fa, fc;
bool flag=true;
printf("Vuberit` integral:\n");
printf ( "1 -- pow(x, 3)-2* pow(x, 2)+7*x+3 \n");
printf ( "2 -- tan(0.55*x+0.1)-pow(x,2) \n");
scanf("%d", &vibir);
if (vibir==2)
{a=0.6; b=0.8; e=0.001;}
else
{ a=-1; b=0;}
e=0.001;
// metod kombin
k=0; flag=true;
fa=f1(a);
fc=f2(a);
if ((fa*fc)>0)
{ x2=a; d=b; y2=b;}
else
{x2=b; d=a; y2=a; }
do
{ k=k++;
x1=x2;
y1=y2;
x2=d-f(d)*((x1-d)/(f(x1)-f(d)));
y2=y1-f(y1)/f1(y1);
e1=fabs(x2-y2);
if (e1<=e)
{ z=(x2+y2)/2; flag=false;}
}
while (flag);
printf("kombinovany metod: z=%f\n", z);
printf("kilkist` iteraciy: k=%d\n\n", k);
// metod prostuh iteraciy
k=0; flag=true;
x1=(a+b)/2;
do
{
k=k++;
x=x1;
printf("x1=%f", x1);
x1=x-1/(50*f(x)*(exp(x),-2));
e1=fabs(x1-x);
z=x1;
}
while(e1<=e);
printf("metod prostuh iteraciy: x1=%f\n", x1);
printf("kilkist` iteraciy: k=%d\n", k);
getch();
}
Объяснение кода листинга программы
- Объявлены переменные:
- vibir (тип int)
- a, b, c, d, e, e1, z, x, x1, x2, y1, y2, fa, fc (тип float)
- k (тип int)
- flag (тип bool)
- В функции main() выполняется следующее:
- Выводится приветствие и два варианта для выбора метода поиска корня.
- Переменная vibir инициализируется значением 0.
- Если выбран второй метод, то выполняется инициализация переменных a, b, e.
- Запускается цикл do-while, который выполняется до тех пор, пока флаг не станет false.
- В каждой итерации цикла выполняется:
- Вычисление значения функции f1(x) и f2(x) для текущего значения x.
- Если значения f1(x) и f2(x) имеют одинаковый знак, то выполняется вычисление нового значения x2 и y2.
- Если значения f1(x) и f2(x) имеют разные знаки, то выполняется вычисление нового значения x2 и y2.
- Вычисление значения e1, которое представляет разницу между x2 и y2.
- Если e1 меньше или равно e, то выполняется вычисление нового значения z.
- После завершения цикла выводится значение z и количество итераций.
- В функции main() также выполняется второй метод поиска корня - метод простых итераций.
- Запускается цикл do-while, который выполняется до тех пор, пока значение e1 не станет меньше или равно e.
- В каждой итерации цикла выполняется:
- Вычисление значения x1.
- Вычисление нового значения x1 на основе формулы x1 = x - 1/(50f(x)(exp(x),-2)).
- Вычисление значения e1.
- Если e1 меньше или равно e, то выполняется вычисление нового значения z.
- После завершения цикла выводится значение z и количество итераций.