C/C++

Нужна помощь с С , можно и на С++

Отделить корни нелинейного уравнения аналитически и уточнить один из них (для всех методов рассматривать одинаковый отрезок) методом итераций, Ньютона, хорд, комбинированным с точностью вычисления до 0.001.
Причем тут язык программирования и обыкновенная математика.
Олексій Грабар
Олексій Грабар
23 484
Лучший ответ
Аъзамжон Собиров ну сказали кодом написать
А делать тут что нужно? Какие корни? Зачем их отделять? Найдём сначала критические точки функции f(x)=x³-3x²+12x-12:
f'(x)=3x²-6x+12=0, квадратное уравнение х²-2х+4=0 не имеет действительных корней, а это значит, что у функции f нет ни максимумов, ни минимумов, ни вообще стационарных точек и как следствие -пересечение её графика с осью абсцисс возможно только в одной единственной точке! Так какие корни надо здесь сначала отделить, а потом найти рядом численных методов -комплексные, что ли?
Так как левая часть уравнения -это полином третьей степени без критических точек, то начальным приближением, например, в ньютоновском методе касательных, может быть любое вещественное число. Да, кстати, ещё надо добавить, что для него, для этого метода, и отрезков никаких рассматривать не нужно -достаточно одного любого введённого действительного числа (брать которое лучше всё таки в разумных пределах !): итерационный процесс всё равно в конечном итоге приведёт к корню, вычисляемого с машинной точностью очень и очень быстро и хотя бы поэтому точность ε=0,001 выглядит очень неказистой, так что сразу можно на неё наплевать. А все другие методы в данном случае -это вообще просто чья-то блажь! Я ещё понимаю, когда сравниваются алгоритмы с точки зрения их эффективности, а тут даже и сравнивать нечего -настолько всё ясно! А теперь сам код на Си:

#include <stdio.h>
double f(double x)
{ return -12. + x * (12. - x * (3. - x)); }
int main() { int i, n; double x, step = 1e-4,
twostep = 2. * step; while (true)
{ printf("x n: "); scanf("%lf%d", &x, &n);
for (i = 1; i <= n; i++)
{ x -= f(x) * twostep / (f(x + step) - f(x - step));
printf("%3d%22.16f\n", i, x); } } }