使用Visual Studio 2008在C ++中实现逐次逼近算法的问题

时间:2010-01-11 15:36:41

标签: c++ visual-studio-2008 algorithm numerical-methods

我正在尝试实现我们在数值方法类中所做的算法。我有一个用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 个答案:

答案 0 :(得分:7)

double x0 = 0; /* initial aproximation */
.
.
x1 = x0;
.
.
while (absval(x1-x0) > c1)

此时,x1 == x0c1为正,因此永远不会输入循环体;这可能不是你想要的。

答案 1 :(得分:2)

我尝试了它确实有效。

0.0833333 solution found in allowed nr of iterations

修改(一个或多个)

您可能希望更改设计,以便每次在循环周围检查i,而不是等到它有答案。事实上,如果迭代出现分歧,它可以永远持续下去。

哦,是的,因为moonshadow说循环永远不会进入: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();