C++中的牛顿正切法
Newton Tangent method in C++
所以我必须写一个起点为 1.0 的牛顿正切程序。
我必须在最后显示迭代计数和结果的根。
如果我为 U0 输入 100,root/result 应该是 2,499204 但不知何故它显示了 17.3333 和一次迭代计数,我认为这不是正确的结果。
我不知道我的错误在哪里,如果有人能指出来就太好了,因为我只是一个初学者。
#include <iostream>
#include <cmath>
#include <iomanip>
using namespace std;
double U0;
const double K = 0.001; //constant
const double R = 1000; //Widerstand
const double ALPHA = 5; //Exponent
const double epsilon = 0.0000001; //epsilon
double f(double u);
double fstrich (double u);
double f(double u)
{
return (-U0+R*K*pow(u,ALPHA)+ u); //U0+R*K*U^a + u
}
double fstrich (double u)
{
return ALPHA*R*K*pow(u,ALPHA-1)+ 1;
}
int main()
{
double i=0; //iteration
double xn = 1.0; //starting point
double xn1; //xn+1
cout << "Geben Sie eine Spannung U0 zwischen -1000 und 1000 ein: ";
cin >> U0;
cout << "\n";
do
{
i++;
xn1 = xn - f(xn)/fstrich(xn);
xn=xn1;
cout<< "Iteration count: "<<i << " " << xn<< " " <<endl;
} while (fabs(xn-xn1)>epsilon);
cout <<"The root is " <<fixed <<setprecision(8)<< xn1 <<endl;
return 0;
}
fabs(xn-xn1)>epsilon
始终为 false,因为之前的代码 xn=xn1;
@user4581301
更改为...
double delta; // add
do
{
i++;
xn1 = xn - f(xn)/fstrich(xn);
delta = xn-xn1; // add
xn=xn1;
cout<< "Iteration count: "<<i << " " << xn<< " " <<endl;
//} while (fabs(xn-xn1)>epsilon);
} while (fabs(delta)>epsilon);
...xn1
迅速收敛到
2.49920357...
所以我必须写一个起点为 1.0 的牛顿正切程序。 我必须在最后显示迭代计数和结果的根。 如果我为 U0 输入 100,root/result 应该是 2,499204 但不知何故它显示了 17.3333 和一次迭代计数,我认为这不是正确的结果。
我不知道我的错误在哪里,如果有人能指出来就太好了,因为我只是一个初学者。
#include <iostream>
#include <cmath>
#include <iomanip>
using namespace std;
double U0;
const double K = 0.001; //constant
const double R = 1000; //Widerstand
const double ALPHA = 5; //Exponent
const double epsilon = 0.0000001; //epsilon
double f(double u);
double fstrich (double u);
double f(double u)
{
return (-U0+R*K*pow(u,ALPHA)+ u); //U0+R*K*U^a + u
}
double fstrich (double u)
{
return ALPHA*R*K*pow(u,ALPHA-1)+ 1;
}
int main()
{
double i=0; //iteration
double xn = 1.0; //starting point
double xn1; //xn+1
cout << "Geben Sie eine Spannung U0 zwischen -1000 und 1000 ein: ";
cin >> U0;
cout << "\n";
do
{
i++;
xn1 = xn - f(xn)/fstrich(xn);
xn=xn1;
cout<< "Iteration count: "<<i << " " << xn<< " " <<endl;
} while (fabs(xn-xn1)>epsilon);
cout <<"The root is " <<fixed <<setprecision(8)<< xn1 <<endl;
return 0;
}
fabs(xn-xn1)>epsilon
始终为 false,因为之前的代码 xn=xn1;
@user4581301
更改为...
double delta; // add
do
{
i++;
xn1 = xn - f(xn)/fstrich(xn);
delta = xn-xn1; // add
xn=xn1;
cout<< "Iteration count: "<<i << " " << xn<< " " <<endl;
//} while (fabs(xn-xn1)>epsilon);
} while (fabs(delta)>epsilon);
...xn1
迅速收敛到
2.49920357...