Найти 2 корня уравнения - C (СИ)
Формулировка задачи:
Нужно найти 2 корня. Уравнение y1 = 3^(x-1) - 4 - x = 0;
На отрезке -5 2 должно быть 2 корня (-3.995 и 2.736)...
Что здесь не так?
double ur1(double x){
return pow(3, x-1)- 4 - x;
}
double pr1(double x){
return log(3) * pow(3, x-1) - 1;
}
int main(int argc, char *argv[])
{
double x = 0, en = 0;
double e = 0.001;
int a, b;
printf("Enter a, b: ");
scanf("%d %d", &a, &b);
en = abs(a - b);
x = (double)b;
int i = 1;
do{
x = x - (ur1(x) / pr1(x));
printf("%d - %lf\n", i, x);
en = abs(x - b);
b = x;
i = i+1;
}while((abs(en)) > e);
return 0;
}Решение задачи: «Найти 2 корня уравнения»
textual
Листинг программы
#include <stdio.h>
#include <math.h>
#include <locale.h>
double y(double x)
{ return pow(3, x-1)- 4 - x;
}
double dy(double x)
{ return log(3.) * pow(3, x-1) - 1;
}
int main()
{ setlocale (LC_CTYPE, "Russian");
double a = -5., step = 1., e = 1.E-6;
double x0, x1;
int i;
while (a < 3.)
{ i = 0;
x0 = a;
x1 = x0-y(x0)/dy(x0);
printf("Точка входа х0 = %.1lf\n", x0);
while (fabs(x1-x0)>e)
{ x0 = x1;
x1 = x0-y(x0)/dy(x0);
i++;
}
printf("\tКоличество итераций i = %3d\n\tПолученный корень х = %lf\n\n", i, x1);
a += step;
}
getchar();
return 0;
}
Объяснение кода листинга программы
В этом коде решается задача нахождения корней уравнения методом Ньютона.
- В функции y(x) и dy(x) определены функции для уравнения и его производной.
- В функции main() определены начальное приближение x0, шаг итерации step и требуемая точность e.
- Цикл while исполняется пока текущее значение переменной a меньше 3.
- На каждой итерации цикла происходит следующее:
- Переменная x0 принимает текущее значение a.
- Вычисляется приближение к корню x1 с помощью формулы Ньютона x1 = x0 - y(x0)/dy(x0).
- Если изменения x1 относительно x0 больше заданной точности e, то выполняется итерация.
- На каждой итерации значение переменной a увеличивается на шаг step.
- После каждой итерации выводится сообщение с текущими значениями x0, x1 и количеством итераций i.
- После завершения цикла while программа завершается.