Итерация С Фиксированной Точкой. Поиск корней.
Я пытаюсь написать программу для поиска корней с помощью метода итерации с фиксированной точкой, и каждый раз, когда я запускаю ее, я получаю ноль. ввод p0=1, Tol=.01
Не мог бы кто-нибудь помочь? Я попытался следовать алгоритму в книге, но я все еще новичок в программировании и не очень хорошо читаю их. Заранее спасибо.
Алгоритм:
Входное начальное приближение p0; допуск TOL; максимальное число итераций N0.
Вывод приближенного решения P или сообщения об аварии.
Шаг 1 Установите i=1.
Шаг 2, пока i <= N0, выполните шаги 3-6.
Шаг 3 Установите p=g(p0). (Вычислить число Пи.)
Шаг 4 Если |p-p0|<tol mode="hold"> OUTPUT (p); (процедура прошла успешно.)
ОСТАНОВИТЬ.
Шаг 5 Установите i=i+1.
Шаг 6 Установите p0=p. (Обновление p0.)
Шаг 7 вывод ('метод не удался после N0 итераций, N0=', N0);
(Процедура оказалась неудачной.)
ОСТАНОВИТЬ.
#include <stdio.h> #include <math.h> double f(double x) { return x*x*x*x-3*x*x-3; //change equation for each problem } int main() { double p, p0, Tol; int i=1; int No; printf("Enter approximate p: "); scanf ("%lf", &p0); printf("Desired Tolerance: "); scanf ("%lf", &Tol); printf("Maximum Iterations: "); scanf ("%d", &No); while (i<=No) { p = p0; if((fabs(p-p0))<Tol) { printf("%lf", &p); break; } printf("Iteration %d: Current value = %lf\n", i, p); i++; //i=i+1 p0=p; if (i>No) { printf("Method Failed after %d", No); printf(" iterations"); }
Вот обновленный вариант:
#include <stdio.h> #include <math.h> double f(double x) { return x*x*x*x-3*x*x-3; //change equation for each problem } double g(double x) { return pow(3*x*x+3,.25); } int main() { double p, p0, Tol; int i=1; int No; printf("Enter approximate p: "); scanf ("%lf", &p0); printf("Desired Tolerance: "); scanf ("%lf", &Tol); printf("Maximum Iterations: "); scanf ("%d", &No); while (i<=No) { p = g(p0); if((fabs(p-p0))<Tol) { //printf("%lf", &p); break; } printf("Iteration %d: Current value = %lf\n", i, p); i++; //i=i+1 p0=p; if (i>No) { printf("Method Failed after %d", No); printf(" iterations"); } } }
Vedat Ozan Oner
что вы ожидаете, если вы говорите p=p0, а затем проверяете p-p0?
MalDrHoop
Я просто оглянулся на алгоритм, и он говорит, чтобы установить p=g(p0). (вычислить pi.) так что это, вероятно, часть того, где я напортачил, я просто не уверен точно, что мне нужно сделать для моего g(p0).
Алгоритм: (см. вопрос)
Vedat Ozan Oner
сначала найдите уравнение (g) для итерации из функции f. затем повторите итерацию, пока x-g(x) не попадает в ваш допуск, как в упомянутом алгоритме.
MalDrHoop
Я полагаю, что не совсем понимаю эту концепцию. Я пропустил несколько занятий из-за болезни. Является ли g(x) в основном переписанной формой данного уравнения? Уравнение, которое я использовал здесь, - это x^4-3x^2-3. значит ли это, что мне нужен элемент x-(x^4-3x^2-3)? Мне очень жаль, но я пытаюсь это понять.
Vedat Ozan Oner
хорошо, приходит еще помощь. чтобы найти корень: x^4-3*x^2-3=0, затем x^4=3*x^2+3, затем x = (3*x^2+3)^0.25, что является вашей функцией g. g(x) = (3*x^2+3)^0.25. для заданного корня функции f g(x) должно быть равно x. начните с 0 для значения x, чем примените алгоритм.
MalDrHoop
Спасибо, я собираюсь попробовать и посмотреть, смогу ли я собрать эту вещь воедино сейчас.
Vedat Ozan Oner
пожалуйста. Я уверен, что вы реализуете этот алгоритм.
MalDrHoop
Я наклеил новую сверху
Vedat Ozan Oner
это кажется хорошим. что ты получаешь? Кстати, мне очень жаль. пить вино :) если у вас есть еще вопросы, задавайте их сейчас, иначе мне будет слишком поздно :p
MalDrHoop
Введите приблизительный p: 1
Необходимый допуск: .01
Максимальное Количество Итераций: 10
Итерация 1: текущее значение = 1.565085
Итерация 2: текущее значение = 1.793573
Итерация 3: текущее значение = 1.885944
Итерация 4: текущее значение = 1.922848
Итерация 5: текущее значение = 1.937508
Процесс вернул 1072693280 (0x3FF00020) время выполнения : 7.555 с
Нажмите любую клавишу, чтобы продолжить.
Vedat Ozan Oner
:) Я хороший парень, Малдрхуп. ваш результат кажется нормальным. а ты как думаешь?
MalDrHoop
Я думаю, что это получилось довольно хорошо. Спасибо за вашу помощь. :)
Vedat Ozan Oner
пожалуйста. а теперь я ухожу.