Проблема с реализацией алгоритма последовательного приближения в C ++ с Visual Studio 2008 - PullRequest
0 голосов
/ 11 января 2010

Я пытаюсь реализовать алгоритм, который мы сделали в классе численных методов. У меня есть идентичная процедура, написанная на Maple, и она отлично работает. Я не могу понять, почему это не работает в C ++.

Любая помощь или советы будут оценены; заранее спасибо.

#include "stdafx.h"
#include "math.h"
#include <iostream>

using namespace std;

double absval(double val)
{
   if (val >= 0) return val;
   else return -val;
}
double G(double x)
{
   double g;

   g = 1/((x*x)+12);
   return g;
}
int main()
{
double c = 0.011834; /* constant */
double eps = 0.00001; /* precision */
double x0 = 0; /* initial aproximation */
double x1,x2,c1;
int i,no;
i = 1;

cout << "enter max nr of iterations ";
cin >> no; 

x1 = x0;
x2 = G(x1);
c1 = (1-c)*eps/c;

while (absval(x1-x0) > c1)
{
    i = i+1;
    x1 = x2;
    x2 = G(x1);

}
cout << x2;
if (i<no) cout << " solution found in allowed nr of iterations ";
else cout << "allowed nr of iterations surpassed ";

}

При запуске кода запрашивается разрешенное количество итераций, а после вставки он закрывается.

Ответы [ 2 ]

7 голосов
/ 11 января 2010
double x0 = 0; /* initial aproximation */
.
.
x1 = x0;
.
.
while (absval(x1-x0) > c1)

в этот момент x1 == x0 и c1 положительны, поэтому тело цикла никогда не вводится; это, вероятно, не то, что вы хотели.

2 голосов
/ 11 января 2010

Я попробовал, и это работает.

0.0833333 solution found in allowed nr of iterations

EDIT (s)

Возможно, вы захотите изменить дизайн так, чтобы он проверял i каждый раз вокруг цикла, вместо того, чтобы ждать ответа. Как бы то ни было, если итерация расходится, она может продолжаться вечно.

О да, и, как говорит лунная тень, петля никогда не вводится: D

Я думаю, вы сравниваете не те вещи? Правильно ли это (тестирование x1-x2 вместо x1-x0):

...

do 
{
    x1 = x2;
    x2 = G(x1);
} while (i++ < no && absval(x1-x2) > c1);


cout << x2 << endl;
if (i<no) cout << " solution found in allowed nr of iterations " << endl;
else cout << "allowed nr of iterations surpassed " << endl;


cout << "Press enter to exit." << endl;
cin.get();
...