【问题标题】:Issue with secant root finding c++割根发现c ++的问题
【发布时间】:2011-05-11 00:55:20
【问题描述】:

我正在尝试为学校编写一个使用割线查找方法的程序。等式是:

( v / b ) ^2sin(alpha)= kr * Ts^4 +Uc *Ts -q

我必须找到 Ts。

不幸的是,我一直用作基础的示例对我不起作用:。它给出的根是 -1.QNAN 或类似的东西,所以我在某处的割线方法中有一个错误,我是 C++ 的新手,所以我在解决这个问题时遇到了很多麻烦。任何帮助将不胜感激,如果有人可以告诉我代码以使发布代码更容易,我将不胜感激。谢谢 到目前为止,这是我的代码:

#include <iostream>
#include <cmath>
#include <fstream>
#include <iomanip>

using namespace std;

void secant (double, double, double, double, double, double, double, double, double, double, double, int);

double fx(double, double, double, double, double, double, double);

const double tol=0.0001;    // Tolerance for convergence

const int max_iter=50;      // Maximum iterations allowed

int main ()
{
    double kr, uc, q, b, radians, Ts, x0, x1, root;
    int iteration; 
    const double PI = 4.0*atan(1.0);

    ifstream datain ("shuttle.txt");
    ofstream dataout ("results.txt");

    datain >> kr >> uc >> q >> b;

    int velocity = 16000;
    double angle =10;

    x0= 1000;
    x1 = 200;

    for (int velocity = 16000; velocity <= 17500; velocity += 500) {
        for (int angle = 10; angle <= 70; angle += 15) {
            radians= angle * PI/180  ;

            cout << velocity << endl;
            cout << radians << endl;
            cout << angle << endl;

           secant (angle, radians, velocity, kr, uc, q, b, Ts, x0, x1, root, iteration);    
        }
    }
    system("pause");

    return 0;
}

void secant(double angle, double radians, double velocity, double kr, double uc, double q, double b, double Ts, double x0, double x1, double root, int iteration) 
{
    double xnminus1, xnplus1, xn;
    iteration=0; 
    xnminus1=x0;
    xn=x1;

    do
    {
        ++iteration;
        xnplus1 = xn - fx(kr, uc, Ts, q, velocity, radians, xn)*(xn-xnminus1)/
                  (fx(kr, uc, Ts, q, velocity, radians,xn)-fx(kr, uc, Ts, q, velocity, radians,xnminus1));

        cout<<"x"<<iteration+1<<" = "<<xnplus1<<endl;

        xnminus1 = xn;

        xn=xnplus1;

    }  

    while ((fabs(fx(kr, uc, Ts, q, velocity, radians, xnplus1)) >= tol )&& (iteration < max_iter))
        ;    
    root=xnplus1;  

    cout<<"\nThe root is = "<<root<<endl;
    cout<<"The number of iterations was = "<<iteration<<endl;
    cout<<"The value of f(x) at the root = "<<fx(kr, uc, Ts, q, velocity, radians, root) <<endl<<endl;    
}

double fx(double kr, double uc, double Ts, double q, double velocity, double b, double radians)
{
    return kr * pow(Ts, 4.0) + uc * Ts - q - pow(velocity/b, 2.0) * sin(radians);
}

【问题讨论】:

标签: c++ methods


【解决方案1】:

您使用 Ts 而不定义它。有趣的是它以蓝色突出显示......我认为有一个高级 SO 用户在某个地方自言自语......

【讨论】:

  • 哦,我正在尝试解决 Ts,所以如果我只是将 Ts 更改为 x,它应该可以正常工作吗?
  • @Brian 这个名字与它无关。从您声明它的那一刻起,只需遵循“Ts”的用法即可。您将它按值传递给 secant(),后者又将它按值传递给 fx()。它在 'pow(Ts, 4.0) 中进行评估,而无需先定义每个。此外,由于您从不向 Ts 分配任何内容,因此完全不清楚您要如何解决它。
  • 如果我不知道它是什么,我将如何定义它?
  • @Brian :在代数环境中思考这个问题,您可能会意识到这听起来多么愚蠢;-]
  • @Brian 我明白了...您需要从猜测开始,跟踪预测误差,并在每次迭代中调整 Ts,以便不断降低误差,直到低于 tol。不过,您确实应该就此与您的讲师会面或阅读这本书,为使您的程序按预期工作所做的工作对 SO 来说有点多。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-22
  • 2017-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多