MalDrHoop Ответов: 0

Итерация С Фиксированной Точкой. Поиск корней.


Я пытаюсь написать программу для поиска корней с помощью метода итерации с фиксированной точкой, и каждый раз, когда я запускаю ее, я получаю ноль. ввод 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

пожалуйста. а теперь я ухожу.

0 Ответов