有人可以向我解释如何使用割线方法找到等式的根?
等式是:( 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)
{
}
答案 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()
的类的实例,并实现上述迭代。确保在某些合适的条件下终止迭代。