因此,我必须以起点1.0编写牛顿切线程序。
我必须在最后显示迭代计数和结果的根。
如果我为U0键入100,则根/结果应为2499204,但不知何故,它显示了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始终为假,就像以前的代码一样 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...

10-06 09:15