Algorytm kivjoja

0

Witam wszystkich, niedawno dałem krótkie zadanie, teraz mam sporo dłuższe.
Muszę napisać program liczacy Algorytm Kivjoja (Geodezja Wyższa), ale mam problem z funkcjami trygonometrycznymi.

//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;
}
1
Argonus napisał(a):

... ale mam problem z funkcjami trygonometrycznymi ...

Nie masz problemu z funkcjami trygonometrycznymi, masz problem z jakimikolwiek funkcjami.
Dowolny kurs z googla, rozdział funkcje.

0

Znalazłem, przepisywałem ze strony MS. Ok mój błąd, ale prawda funkcji jeszcze nie zacząłem, a program robię żeby nie zwariować przy liczeniu każdej poprawki osobno. Dzięki :)

0

Przerobiłem materiał z funkcji moja wina. Ale mam jeszcze jeden problem.
Algorytm źle oblicza mi zmienną x[i]. Do tego momentu jest wszystko ok a przy tej zmiennej pada.

//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;
}
2

A nie umiesz skorzystać z debugera?
Nawet jeżeli z debugerem masz problem to wstawiasz przed tym wierszem:

cout<<i<<": "<<FFi1[i]/2<<" = "<<FFi1[i]<<" / 2;"<<endl;

I patrzysz co się dzieje.

Tak a propos, zastanów się nad zmianą początku pętli:

    for(i=0;i<podzial;++i)
    {
        double sinfip=sin(Fip[i]);
        double pierwiastek= sqrt(1-e*sinfip*sinfip);
        N[i]=a/pierwiastek;
        M[i]=(1-e)*N[i];
        FFi1[i]=ds*cos(Aab[i])/M[i];

Dalej podobnie.

  1. Nie używaj i++ tam gdzie możesz użyć ++i - bo ci to się zemści
  2. Używaj zmiennych tymczasowych, na pierwiastek nie potrzebujesz tablicy
  3. Nadmiarowe nawiasy nie zawsze zwiększają czytelność
  4. Nie nadużywaj pow - jest obliczany jako exp(wykladnik*log(podstawa)) nawet jeżeli w koprocesorze to i tak dłużej niż zwykły iloczyn
  5. Komentarz do N[i]=... o treści Obliczam N naprawdę nic nie wnosi
  6. Skoro używasz tylko M[0] w wyświetleniach to może warto zamiast tablicy M zrobić dwie zmienne: M0 oraz Mi (analogicznie dla reszty).
0

Wywala mi problem przy dzieleniu. Sorry, ale nie rozumiem czemu, nie mogę dać dla double signed tak jak przy liczba całkowitych.
Próbowałem jakoś z nawiasami to rozwiązać ale nie daje rady, jakaś rada? W która stronę mam z tym iść?

0

Problemy przy dzieleniu przez 2 ? Chrzani waść.
double zawsze jest signed z definicji.
Idź w stronę światła ... czyli debuger lub rozsądne wyświetlenie wyników pośrednich.
Uporządkuj kod, masz taki bajzel że w głowie się nie mieści.

0

Tak, rozumiem ale debbugera nie przerobię do niedzieli. A nie rozumiem gdzie mam błąd.
Wiem, że mam bajzel ale c++ uczę się 3 tygodnie. Mam program tak spisany jak mam podany algorytm na przedmiocie.
Tablice mam zapisane w dwóch miejscach, dane początkowe i tablice używane do algorytmu.

Oczywiście, ze siądę do debbugera ale na razie nawet nie wiem od czego zacząć.

1
Argonus napisał(a):

Tak, rozumiem ale debbugera nie przerobię do niedzieli.
Wystarczy kilka minut, nie musisz umieć wszystko.

Argonus napisał(a):

A nie rozumiem gdzie mam błąd.
I nie zrozumiesz dopóki masz bajzel.

Argonus napisał(a):

Wiem, że mam bajzel ale c++ uczę się 3 tygodnie.
Tak wmawiaj sobie, jak teraz masz bajzel to sam się nie posprząta.

Argonus napisał(a):

Mam program tak spisany jak mam podany algorytm na przedmiocie.
Chrzani waść. Na 100% nikt nie kazał zamiast jednej zmiennej użyć całej tablicy.

Argonus napisał(a):

Tablice mam zapisane w dwóch miejscach, dane początkowe i tablice używane do algorytmu.
Nie potrzebujesz tu żadnej tablicy tylko kilka osobnych zmiennych na stan początkowy, zamiast tablic pojedyncze zmienne, oraz kilka dodatkowych zmiennych dla kroku następnego.

Argonus napisał(a):

Oczywiście, ze siądę do debbugera ale na razie nawet nie wiem od czego zacząć.
Podałem ci w 6-ciu punktach.

0

Ok, poprawiłem tak jak mówiłeś, choć jednego nie jestem pewien jak zmienię i++ na ++i, to przecież od razu będzie mi wpisać wszystko w tablicę [1] a nie [0], bo komenda ++i będzie wykonana przed funkcją.
Pozostał mi jeden problem, program daje inną dokładność niż Excel na 10 miejscu po przecinku, z moich obliczeń wychodzi że winna jest zmienna (FFi1/2), na powyżej 10 miejsca po przecinku. Można jakoś zwiększyć dokładność.
P.S Dzięki za 6 rad, program faktycznie jest czytelniejszy.

//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;

	double M;
	double Mmi;
	
	double N;
	double Nmi;
	
	double pAmi[100];
	double Ami[100];
	
	double FFi1;
	double Fim[100];

	double pierwiastek;
	double pierwiastekm;

	double Yi[100];
	double Li[100];
	double Ai[100];

	for(i = 0; i < podzial; ++i)
	{
	// Obliczam M i N;
		pierwiastek =  sqrt(1 - ( e * sin(Fip[i]) * sin(Fip[i])));
		N = a/pierwiastek;
		M = (1-e)* N;
	//Obliczam pierwszy przyrost 
		FFi1 = (ds * (cos(Aab[i])) / M);
		cout <<endl<<i<<": "<<(FFi1)/2<<" = "<<FFi1<<" / 2;"<<endl;
		Fim[i] = Fip[i] + (FFi1/2.000);		// Tu mam problem
	// Obliczam Mmi i Nmi
		pierwiastekm =  sqrt(1 - ( e * sin(Fim[i])*sin(Fim[i])));
		Nmi = (a) / (pierwiastekm);
		Mmi = (1-e)*Nmi;
	// Obliczam Ami
		pAmi[i] = ( ds * (sin(  Aab[i])) * (tan(  Fim[i]))) / (Nmi);
		Ami[i] = Aab[i] + (0.5 * pAmi[i]);
	//Obliczam dla elemntu ds
		// Obliczam Yi
		Yi[i] = ( ds * (cos( Ami[i])) ) / Mmi;
		// Obliczam Li
		Li[i] = ( ds * (sin( Ami[i]))) / ( Nmi * (cos(Fim[i])));
		// Obliczam Ai
		Ai[i] = ((ds * (sin( Ami[i]))) * (tan( Fim[i]))) /( Nmi);
	// 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( 11 );
	cout << "Podaje wyniki pośrednie: " << "M = " << M << " N = " << N << " FFi1 = " << FFi1 << endl;
	cout << " Fim = " << Fim[0] << " Mmi = " << Mmi << " Nmi = " << Nmi << " pAmi = " << pAmi[0];
	cout << " Ami = " << Ami[0] << endl;
	cout.precision(10);
	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;
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1