Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Program- Algorytm Kivjoja.

Ostatnio zmodyfikowano 2014-12-08 13:03
Autor Wiadomość
Argonus
Temat założony przez niniejszego użytkownika
Program- Algorytm Kivjoja.
» 2014-12-02 16:51:24
Witam wszystkich, mam taki problem. Muszę napisać program liczący algorytm Kivjoja (Geodezja Wyższa)
Ale żeby nie było za łatwo, mam problem z funkcjami trygonometrycznymi.
Czy ktoś mógłby zerknąć i powiedzieć co mam z tym zrobić?
C/C++
//Kivjoj.cpp
#include<iostream>
#include<math.h>

int main()
{
    using namespace std;
    double Fip[ 100 ];
    double lambdap[ 100 ];
    float SAB;
    double Aab[ 100 ];
    double a = 6378137;
    double e = 0.0066943800229;
   
    cout << "Podaj dane w [rad]: " << endl;
    cout << "Fip = ";
    cin >> Fip[ 0 ];
    cout << "Lambdap = ";
    cin >> lambdap[ 0 ];
    cout << "Sab = ";
    cin >> SAB;
    cout << "Azymut Aab = ";
    cin >> Aab[ 0 ];
    // Punkt I. Dzielimy całą długość linii geodezyjnej s na n elementów ds.
   
    cout << "Pkt I. Dzielimy cala dlugosc linii geodezyjnej s na n elementow ds";
    int podzial;
    cout << "Podaj liczbe odcinkow: ";
    cin >> podzial;
    double ds;
    ds = SAB / podzial;
    cout << "Odcinek ds = " << ds;
   
    // Początek petli Kivjoj'a
    int i;
    double M[ 100 ];
    double N[ 100 ];
    double FFi1[ 100 ];
    double Fim[ 100 ];
   
    for( i = 0; i < podzial; i++ )
    {
        // Obliczam M i N;
        // Obliczam sinus
        double sinus[ 100 ];
        sinus[ i ] = double sin( double Fip[ i ] );
        //Obliczam potege sinusa
        double potega[ 100 ];
        double y = 2;
        potega[ i ] = double pow( double sinus[ i ], double y );
        // Obliczam x
        double x[ 100 ];
        x[ i ] =( 1 - e * potega[ i ] );
        //Obliczam pierwiastek
        double pierwiastek[ 100 ];
        pierwiastek[ i ] = double sqrt( double x );
        //Obliczam M
        M[ i ] =( a *( 1 - e ) ) /( pierwiastek[ i ] );
        //Obliczam N
        N[ i ] =( a ) /( pierwiastek[ i ] );
        //Obliczam pierwszy przyrost
        // Obliczam cosinusa
        double cosinusA[ 100 ];
        cosinusA[ i ] = double cos( double Aab[ i ] );
        // Obliczam Fi male
        FFi1[ i ] =( ds * cosinusA[ i ] ) / M[ i ];
        // Obliczam φmi
        Fim[ i ] = Fip[ i ] +( 0.5 * FFi1[ 1 ] );
        // Obliczam Mmi i Nmi
        //Obliczam sinus posredni
        double sinusm[ 100 ];
        sinusm[ i ] = double sin( double Fim[ i ] );
        //Obliczam potege sinusa
        double potegam[ 100 ];
        potegam[ i ] = double pow( double sinusm[ i ], double y );
        //Obliczam x
        double xm[ 100 ];
        xm[ i ] =( 1 - e * potegam[ i ] );
        //Obliczam pierwiastek
        double pierwiastekm[ 100 ];
        pierwiastekm[ i ] = double sqrt( double xm[ i ] );
        //Obliczam Mmi
        double Mmi[ 100 ];
        Mmi[ i ] =( a *( 1 - e ) ) / pierwiastekm[ i ];
        //Obliczam Nmi
        double Nmi[ 100 ];
        Nmi[ i ] =( a ) /( pierwiastekm[ i ] )
        // Obliczam Ami
        // Obliczam sinusa
        double sinusA[ 100 ];
        sinusA[ i ] = double sin( double Aab[ i ] );
        // obliczam Tangensa
        double tangensFi[ 100 ];
        tangensFi[ i ] = double tan( double Fim[ i ] );
        // obliczam Ami posrednie
        double pAmi[ 100 ];
        pAmi[ i ] =( ds * sinusA[ i ] * tangensFi[ i ] ) /( Nmi[ i ] );
        double Ami[ 100 ];
        Ami[ i ] = Aab[ i ] +( 0.5 * pAmi[ i ] );
        //Obliczam dla elemntu ds
        // Obliczam cosinus
        double cosinusAmi[ 100 ];
        cosinusAmi[ i ] = double cos( double Ami[ i ] );
        // Obliczam Yi
        double Yi[ 100 ];
        Yi[ i ] =( ds * cosinusAmi[ i ] ) / Mmi[ i ];
        // Obliczam sinusAmi
        double sinusAmi[ 100 ];
        sinusAmi[ i ] = double sin( double Ami[ i ] );
        //Obliczam cosinusFi
        double cosFi[ 100 ];
        cosFi[ i ] = double cos( double Fim[ i ] );
        // Obliczam Li
        double Li[ 100 ];
        Li[ i ] =( ds * sinusAmi[ i ] ) /( Nmi[ i ] * cosFi[ i ] );
        // Obliczam Ai
        double Ai[ 100 ];
        Ai[ i ] =( ds * sinusAmi[ i ] * tangensFi[ i ] ) / Nmi[ i ] );
        // Kończenie pęteli dane pkt 2.
        //Obliczam Fip[1]
        Fip[ i + 1 ] = Fip[ i ] + Yi[ i ];
        //Obliczam lambdap[1]
        lambdap[ i + 1 ] = lambdap[ i ] + Li[ i ];
        //Obliczam Aab[1]
        Aab[ i + 1 ] = Aab[ i ] + Ai[ i ];
    }
    cout << "Podaje wyniki: " << endl;
    cout << "Fip = " << Fip[ podzial ];
    cout << "Lambdap = " << lambdap[ podzial ];
    cout << "Aab = " << Aab[ podzial ];
    system( "pause" );
    return 0;
}
 
P-121949
kubawal
» 2014-12-02 16:58:04
Konkretnie?
Błąd z kompilacją czy wynikiem?

C/C++
cosinusAmi[ i ] = double sin( double Ami[ i ] );
Hmmm, WTF?
P-121951
Argonus
Temat założony przez niniejszego użytkownika
» 2014-12-02 17:16:16
No właśnie nie wiem jak użyć funkcji sin/cos itp.
Czy muszę dla nich za każdym razem pisać oddzielną funkcję? A jeśli tak to jak ją wrzucić w pętle.
P-121955
kubawal
» 2014-12-02 17:19:11
sin() i cos() używa się jak każdą normalną funkcję.
cosinusAmi[ i ] = sin( Ami[ i ] );
P-121957
Argonus
Temat założony przez niniejszego użytkownika
» 2014-12-02 18:44:24
Zmodyfikowałem trochę program
C/C++
//Kivjoj.cpp
#include<iostream>
#include<math.h>

int main()
{
    using namespace std;
    double Fip[ 100 ];
    double lambdap[ 100 ];
    double SAB;
    double Aab[ 100 ];
    double a = 6378137;
    double e = 0.0066943800229;
   
    cout << "Podaj dane w [rad]: " << endl;
    cout << "Fip = ";
    cin >> Fip[ 0 ];
    cout << "Lambdap = ";
    cin >> lambdap[ 0 ];
    cout << "Sab = ";
    cin >> SAB;
    cout << "Azymut Aab = ";
    cin >> Aab[ 0 ];
    // Punkt I. Dzielimy całą długość linii geodezyjnej s na n elementów ds.
   
    cout << "Pkt I. Dzielimy cala dlugosc linii geodezyjnej s na n elementow ds";
    int podzial;
    cout << "Podaj liczbe odcinkow: ";
    cin >> podzial;
    double ds;
    ds = SAB / podzial;
    cout << "Odcinek ds = " << ds;
   
    // Początek petli Kivjoj'a
    int i;
    double M[ 100 ];
    double N[ 100 ];
    double FFi1[ 100 ];
    double Fim[ 100 ];
   
    for( i = 0; i < podzial; i++ )
    {
        // Obliczam M i N;
        double pierwiastek[ 100 ];
        pierwiastek[ i ] = sqrt(( 1 -( e *( pow( sin( Fip[ i ] ), 2 ) ) ) ) );
        //Obliczam M
        M[ i ] =( a *( 1 - e ) ) /( pierwiastek[ i ] );
        //Obliczam N
        N[ i ] =( a ) /( pierwiastek[ i ] );
        //Obliczam pierwszy przyrost
        // Obliczam Fi male
        FFi1[ i ] =( ds *( cos( Aab[ i ] ) ) / M[ i ] );
        // Obliczam φmi
        Fim[ i ] = Fip[ i ] +( 0.5 * FFi1[ 1 ] );
        // Obliczam Mmi i Nmi
        double pierwiastekm[ 100 ];
        pierwiastekm[ i ] = sqrt(( 1 -( e *( pow( sin( Fim[ i ] ), 2 ) ) ) ) );
        //Obliczam Mmi
        double Mmi[ 100 ];
        Mmi[ i ] =( a *( 1 - e ) ) / pierwiastekm[ i ];
        //Obliczam Nmi
        double Nmi[ 100 ];
        Nmi[ i ] =( a ) /( pierwiastekm[ i ] );
        // Obliczam Ami
        double pAmi[ 100 ];
        pAmi[ i ] =( ds *( sin( Aab[ i ] ) ) *( tan( Fim[ i ] ) ) ) /( Nmi[ i ] );
        double Ami[ 100 ];
        Ami[ i ] = Aab[ i ] +( 0.5 * pAmi[ i ] );
        //Obliczam dla elemntu ds
        // Obliczam Yi
        double Yi[ 100 ];
        Yi[ i ] =( ds *( cos( Ami[ i ] ) ) ) / Mmi[ i ];
        // Obliczam Li
        double Li[ 100 ];
        Li[ i ] =( ds *( sin( Ami[ i ] ) ) ) /( Nmi[ i ] *( cos( Fim[ i ] ) ) );
        // Obliczam Ai
        double Ai[ 100 ];
        Ai[ i ] =(( ds *( sin( Ami[ i ] ) ) ) *( tan( Fim[ i ] ) ) ) /( Nmi[ i ] );
        // Kończenie pęteli dane pkt 2.
        //Obliczam Fip[1]
        Fip[ i + 1 ] = Fip[ i ] + Yi[ i ];
        //Obliczam lambdap[1]
        lambdap[ i + 1 ] = lambdap[ i ] + Li[ i ];
        //Obliczam Aab[1]
        Aab[ i + 1 ] = Aab[ i ] + Ai[ i ];
    }
    cout << "Podaje wyniki: " << endl;
    cout << "Fip = " << Fip[ podzial ];
    cout << "Lambdap = " << lambdap[ podzial ];
    cout << "Aab = " << Aab[ podzial ];
    system( "pause" );
    return 0;
}
Tyle że teraz wyświetla mi zupełnie inny wynik jak excel.
1. Dane podaje w radianach dla funkcji trygonometrycznych.
2. Funkcje są na pewno dobrze spisane. Jak mam zwiększyć dokładność po przecinku bo dostaje
Ledwie  6 miejsci A potrzebuję 11
3. Koniec programu ma wyświetlić ostatni obliczony wynik.  11 ;/
P-121972
michal11
» 2014-12-02 19:17:38
Jaki sens ma tworzenie tablic w pętli ? Zawsze odwołujesz się tylko do i-tego elementu, i w dodatku przy każdym obiegu pętli tworzysz zupełnie nowe tablice.
P-121976
Argonus
Temat założony przez niniejszego użytkownika
» 2014-12-03 12:49:56
Dzięki za radę co do tablic, udało mi się zlokalizować gdzie mam błąd ale nie umiem go rozwiązać.
C++ zle oblicza mi zmienna x. Bardzo proszę o pomoc.
C/C++
//Kivjoj.cpp
#include<iostream>
#include<math.h>

int main()
{
    using namespace std;
    double Fip[ 100 ];
    double lambdap[ 100 ];
    double SAB;
    double Aab[ 100 ];
    double a = 6378137;
    double e = 0.0066943800229;
   
    cout << "Podaj dane w [rad]: " << endl;
    cout << "Fip = ";
    cin >> Fip[ 0 ];
    cout << "Lambdap = ";
    cin >> lambdap[ 0 ];
    cout << "Sab = ";
    cin >> SAB;
    cout << "Azymut Aab = ";
    cin >> Aab[ 0 ];
    // Punkt I. Dzielimy całą długość linii geodezyjnej s na n elementów ds.
   
    cout << "Pkt I. Dzielimy cala dlugosc linii geodezyjnej s na n elementow ds" << endl;
    int podzial;
    cout << "Podaj liczbe odcinkow: ";
    cin >> podzial;
    double ds;
    ds = SAB / podzial;
    cout << "Odcinek ds = " << ds;
   
    // Początek petli Kivjoj'a
    int i;
    int coute = 0;
    double x[ 100 ];
   
    double M[ 100 ];
    double Mmi[ 100 ];
   
    double N[ 100 ];
    double Nmi[ 100 ];
   
    double pAmi[ 100 ];
    double Ami[ 100 ];
   
    double FFi1[ 100 ];
    double Fim[ 100 ];
   
    double pierwiastek[ 100 ];
    double pierwiastekm[ 100 ];
   
    double Yi[ 100 ];
    double Li[ 100 ];
    double Ai[ 100 ];
   
    for( i = 0; i < podzial; i++ )
    {
        // Obliczam M i N;
        pierwiastek[ i ] = sqrt(( 1 -( e *( pow( sin( Fip[ i ] ), 2 ) ) ) ) );
        //Obliczam M
        M[ i ] =( a *( 1 - e ) ) /( pierwiastek[ i ] );
        //Obliczam N
        N[ i ] =( a ) /( pierwiastek[ i ] );
        //Obliczam pierwszy przyrost
        // Obliczam Fi male
        FFi1[ i ] =( ds *( cos( Aab[ i ] ) ) / M[ i ] );
        // Obliczam Fmi
        x[ i ] =( FFi1[ i ] / 2 ); // Tu mam problem
        Fim[ i ] = Fip[ i ] +( x[ i ] ); // Tu mam problem
        // Obliczam Mmi i Nmi
        pierwiastekm[ i ] = sqrt(( 1 -( e *( pow( sin( Fim[ i ] ), 2 ) ) ) ) );
        //Obliczam Mmi
        Mmi[ i ] =( a *( 1 - e ) ) / pierwiastekm[ i ];
        //Obliczam Nmi
        Nmi[ i ] =( a ) /( pierwiastekm[ i ] );
        // Obliczam Ami
        pAmi[ i ] =( ds *( sin( Aab[ i ] ) ) *( tan( Fim[ i ] ) ) ) /( Nmi[ i ] );
        Ami[ i ] = Aab[ i ] +( 0.5 * pAmi[ i ] );
        //Obliczam dla elemntu ds
        // Obliczam Yi
        Yi[ i ] =( ds *( cos( Ami[ i ] ) ) ) / Mmi[ i ];
        // Obliczam Li
        Li[ i ] =( ds *( sin( Ami[ i ] ) ) ) /( Nmi[ i ] *( cos( Fim[ i ] ) ) );
        // Obliczam Ai
        Ai[ i ] =(( ds *( sin( Ami[ i ] ) ) ) *( tan( Fim[ i ] ) ) ) /( Nmi[ i ] );
        // Kończenie pęteli dane pkt 2.
        //Obliczam Fip[1]
        Fip[ i + 1 ] = Fip[ i ] + Yi[ i ];
        //Obliczam lambdap[1]
        lambdap[ i + 1 ] = lambdap[ i ] + Li[ i ];
        //Obliczam Aab[1]
        Aab[ i + 1 ] = Aab[ i ] + Ai[ i ];
       
        coute++;
       
    }
    cout << endl;
    cout << "Podaje wyniki: " << endl;
    cout << "Liczba powtorzen petli: " << coute++ << endl;
    cout.precision( 7 );
    cout << "Podaje wyniki pośrednie: " << "M = " << M[ 0 ] << " N = " << N[ 0 ] << " FFi1 = " << FFi1[ 0 ] << " x = " << x[ 0 ];
    cout << " Fim = " << Fim[ 0 ] << " Mmi = " << Mmi[ 0 ] << " Nmi = " << Nmi[ 0 ] << " pAmi = " << pAmi[ 0 ];
    cout << " Ami = " << Ami[ 0 ] << endl;
    cout << "Podaje wyniki posrednie: " << "B = " << Yi[ podzial - 1 ] << " L = " << Li[ podzial - 1 ] << " A = " << Ai[ podzial - 1 ] << endl;
    cout << "Fip = " << Fip[ podzial ] << endl;
    cout << "Lambdap = " << lambdap[ podzial ] << endl;
    cout << "Aab = " << Aab[ podzial ] << endl;
    cout << endl;
    system( "pause" );
    return 0;
}
P-122054
Tomek_z_W11
» 2014-12-03 16:14:32
Myślę, że przyczyną błędów może być dzielenie całkowite, czyli w linijce:
C/C++
x[ i ] =( FFi1[ i ] / 2 ); // Tu mam problem

Zamień na:

C/C++
x[ i ] =( FFi1[ i ] / 2.0 ); // Tu mam problem

Dzieląc przez 2.0 zaznaczasz, że chcesz dzielenie double'a przez double, w związku z czym wynikiem też będzie double.
P-122076
« 1 » 2
  Strona 1 z 2 Następna strona