2011-05-11 55 views
0

我正在試圖爲學校將使用割線根發現方法的程序。的公式爲:問題與割線根發現C++

(V/B)^ 2sin(阿爾法)= 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); 
} 
+0

要格式化代碼,請閱讀:http://meta.stackexchange.com/questions/ 22186/how-do-i-format-my-code-blocks – rlc 2011-05-11 01:07:31

+0

...你的問題是? – 2011-05-11 01:11:01

+0

我正在尋找某人來幫助我找出我的代碼有什麼問題,因爲我的割線方法沒有工作,我不知道什麼是錯的。 – Brian 2011-05-11 01:18:11

回答

0

你使用Ts而沒有定義它。有趣的是,它以藍色突出顯示...我認爲有一位高級SO用戶在某處笑了...

+0

ohhh,我想解決Ts,所以如果我只是將Ts改爲x,它應該是正確的? – Brian 2011-05-11 02:18:36

+0

@Brian這個名字與它無關。從宣佈它的那一刻起,請遵循'Ts'的用法。您通過值傳遞給secant(),然後再通過值將其傳遞給fx()。它在'pow(Ts,4.0)中進行評估,沒有先確定每一個。另外,既然你從不給Ts分配任何東西,目前還不清楚你是如何解決它的。 – 2011-05-11 02:28:32

+0

我如何定義它,如果我不知道它是什麼? – Brian 2011-05-11 02:33:20