我正在尝试实现我们在数值方法类中所做的算法。我有一个用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 ";
}
运行代码时,它会询问允许的迭代次数,插入后会关闭。
答案 0 :(得分:7)
double x0 = 0; /* initial aproximation */
.
.
x1 = x0;
.
.
while (absval(x1-x0) > c1)
此时,x1 == x0
和c1
为正,因此永远不会输入循环体;这可能不是你想要的。
答案 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();