【问题标题】:help with secant root finding C++帮助寻找正割根 C++
【发布时间】:2023-07-10 15:52:01
【问题描述】:

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

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

#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)
{

}

【问题讨论】:

  • 你能在纸上举出一个例子吗?先试试吧提示:首先,重新排列等式,以便在一侧获得Ts,在另一侧获得其他内容。如果你不会做代数,你就不能做这种编程难题......

标签: c++ root


【解决方案1】:

[ 实际上有一种求解四次方程的解析方法(这无疑是相当复杂的),但由于这是家庭作业,您可能需要正割数值方法。对于额外的分数,您可能需要检查分析结果是否一致!]

我假设您已经检查过Wikipedia。表明数值迭代为:

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

Start with x[0], x[1] suitably chosen - e.g.使用 Excel 中的图形猜测。

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

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


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

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

【讨论】:

    【解决方案2】:

    Secant Method 上的 Wikipedia 文章包含一个很好的连续 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。 (它还可以消除您现在遇到的令人困惑的双内循环。这只是将任何错误乘以几百倍的秘诀。:)

    【讨论】: