2011-05-10 70 views
1

有人可以向我解釋我將如何使用割線方法找到方程的根? 該方程是:(v/b) ^2sin(alpha)= kr * Ts^4 +Uc *Ts -q 我必須找到Ts。我有所有其他信息,但是我對使用seccant方法應該做的事感到困惑。任何幫助將不勝感激。幫助割線尋根C++

這裏是我到目前爲止的代碼:

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

} 
+4

你能在紙上找出一個例子嗎?首先嚐試一下。提示:首先,重新排列方程,使得你在一側得到'Ts',而在另一側得到'Ts'。如果你不能做代數,你不能做這種編程難題...... – 2011-05-10 04:49:09

回答

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。 (它也會消除你現在得到的令人困惑的雙重內部循環,這只是將任何錯誤乘以幾百倍的祕訣:) :)

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()一個類的實例,並且實現上述迭代。確保在一些合適的條件下終止迭代。