帮助使用割线根查找C ++

时间:2011-05-10 03:55:00

标签: c++ root

有人可以向我解释如何使用割线方法找到等式的根? 等式是:( v / b ) ^2sin(alpha)= kr * Ts^4 +Uc *Ts -q 我必须找到Ts。我有所有其他信息,但我对使用seccant方法应该做的事情感到困惑。任何帮助将不胜感激。

到目前为止,这是我的代码:

#include <iostream>
#include <cmath>
#include <fstream>
#include <iomanip>
#include <cmath>
using namespace std;

void secant(double, double, double, double, double, double, double);
int main()
{
    double kr, uc, q, b, radians;

    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;

    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);
        }
    }
    getchar();
}

void secant(double angle, double radians, double velocity, double kr, double uc,
        double q, double b)
{

}

2 个答案:

答案 0 :(得分:0)

关于Secant Method的维基百科文章包含了一个很好的连续x_n值布局,我在这里剪切了它:



...

您需要使用secant方法迭代计算这些x_n值,直到(a)您意识到方法发散,并且找不到解决方案或(b)您的连续x_n值变化足够小您可以愉快地将结果称为根的金额。

因此,您需要一个函数f,您可以调用它来计算您的等式:

double f(double Ts, double v, double b, double alpha, double kr, double Uc, double q) {
    double first = pow(v/b, 2.0) * sin(alpha);
    double second = kr * pow(Ts, 4.0) + Uc * Ts - q;
    return first - second;
}

务必检查操作顺序。 :)用HTML编写方程式总是不确定的。

接下来,您需要编写一个检查退出条件的循环:

x_0 = /* some guess */
x_1 = x_0 + .01 /* or similar */
while ( (fabs(x_0 - x_1) > EPSILON) && (fabs(x_0 - x_1) < DIVERGENCE) ) {
    x_new = x_1 - f(x_1, /* rest */) * (x_1 - x_0) / (f(x_1, /* rest */) - f(x_0, /* rest */));
    x_0 = x_1;
    x_1 = x_new;
}

可能会考虑隐藏所有未通过宏解决的f()参数。这将有助于确保以正确的顺序获得所有参数。

并且肯定会考虑在跳转到多变量函数之前解决更简单的函数,例如x^2 - 17 == 0。 (它还会删除你现在所遇到的令人困惑的双内循环。这只是将任何错误乘以几百倍的方法。)

答案 1 :(得分:0)

[实际上有一种解析四分法的分析方法(公认是相当参与),但由于这是家庭作业,你可能想要割线数值方法。对于额外的标记,您可能需要检查分析结果是否一致!]

我假设您已经检查了Wikipedia。它表明数值迭代是:

x[n] = x[n-1] - f(x[n-1]) * (x[n-1] - x[n-2])/(f(x[n-1] - f(x[n-2]));

从适当选择的x[0], x[1]开始 - 例如使用Excel中的图形猜测。

为了很好地进行迭代,您可能想要抽象f(x)。您可以使用函数指针,仿函数或仅使用抽象类。

class Function
{
public:
    virtual double evaluate(double x) const = 0;  
};


double findRootUsingSecant(const Function& function, double x0, double x1);

通过计算公式传递实现evaluate()的类的实例,并实现上述迭代。确保在某些合适的条件下终止迭代。