2011-05-11 2 views
0

시컨트 루트 찾기 방법을 사용할 학교용 프로그램을 wirte하려고합니다. 방정식은 다음시컨트 루트 찾기 문제 C++

(V/B)^2sin (알파) = KR * TS^4 + UC * TS가

-q와 난 TS를 찾을 수있다.

불행히도 내베이스가 나를 위해 작동하지 않기 때문에 예제를 사용하고 있습니다. 그것이 제공하는 루트 -1.QNAN 또는 그 라인을 따라 무언가 어딘가에 secant 방법에 실수를 가지고, 나는 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

+0

... 귀하의 질문은 무엇입니까? –

+0

나는 내 시컨트 방식이 작동하지 않고 무엇이 잘못되었는지 모르기 때문에 내 코드에 문제가 생기지 않도록 도와 줄 사람을 찾고있다. – Brian

답변

0

정의하지 않고 Ts를 사용합니다. 웃기는 파란색으로 강조 표시됩니다 ... 나는 어딘가에 자신을 chuckling 수석 SO 사용자가 있다고 생각 ...

+0

오호, 해결하려고합니다. Ts, 그래서 Ts를 x로 변경하면 올바르게 작동할까요? – Brian

+0

@ 브라이언 이름은 그 이름과 아무 관련이 없습니다. 당신이 선언 한 순간부터 'Ts'의 사용법을 따라하십시오. secant()에 값을 전달하면 fx()에 값을 전달합니다. 그것은 'pow (Ts, 4.0)'에서 처음 평가 될 때마다 평가되지 않고 평가됩니다. 또한 Ts에 아무 것도 지정하지 않으므로 해결 방법을 분명히 알 수 없습니다. –

+0

내가 무엇인지 모르면 어떻게 정의하겠습니까? – Brian