[C++] Program calkowanie sprawdzenie poprawnosci

0

Witam, mam do napisania projekt całkowania analitycznego i numerycznego funkcji (-A/w)(cos(wb)-cos(w*a)) -----funkcja już po scałkowaniu. Mam teraz pytanie bo analitycznie to wiadomo trzeba pobieramy pulsacje, amplitude, kroki, przedziały i wrzucamy do funkcji. Problem jest jednak w całkowaniu sposobem trapezowym. Bo wyniki faktycznie są bardzo podobne co jest dobrym znakiem bo muszą się różnić minimalnie, jednak na końcu powinienem wszytsko pomnożyć przez h/2 (mnożę już sumę z całki żeby otrzymać pole). Po pomnożeniu wychodzi dziwny wynik, natomiast bez mnożenia jest wszystko OK. Czy ktoś może rzucić okiem na poprawność programu?

#include<iostream>
#include<iomanip>
#include<math.h>
#include <cstdlib>
#include <fstream>

using namespace std;

double analitycznie(double A,double w, double a, double b)
{
return (-A/w)(cos(wb)-cos(w*a));
}

double Pole(int a, int b, int n, int A, int w)
{
double
spr=b-a;

double wy;
double h=spr/n;

int j=1;
double xa=0.0;
double xb=0.0;
double suma_calki=0.0;
for (int i=0; i<=n; i++)
{
xa=a+ih;
xb=a+j
h;
suma_calki+=analitycznie(A, w, xa, xb);
j++;

  }


  return suma_calki;

}

int main()
{

int a, b, n, w, A;
cout<<"Podaj pulsacje w "<<endl;
cin >>w;
cout<<"Podaj Amplitude A"<<endl;
cin>>A;
cout<<"Podaj liczbe trapezow: ";
cin>>n;
cout<<"Podaj przedzial a "<<endl;
cin>>a;
cout<<"Podaj przedzial b "<<endl;
cin>>b;

if(!(a<b))
cout<<"To nie jest przedział!";
else
cout<<"Pole figury wynosi metoda trapezowa : "<<Pole(a, b, n, A, w)<<endl;
cout<< "Pole figury wynois metoda analityczna "<< analitycznie(A, w, a, b)<<endl;

double bezwzgledna=(Pole(a, b, n, A, w)- analitycznie(A, w, a, b))/analitycznie(A, w, a, b);

cout<< " Blad wzgledny wynosi "<<(Pole(a, b, n, A, w)- analitycznie(A, w, a, b))/analitycznie(A, w, a, b)<<endl;
cout<< " Blad bezwzgledny wynosi "<<bezwzgledna*100<<"%"<<endl;
fstream Plik;
Plik.open("Dane.txt", ios::out | ios::app);
Plik<<"Dla danych: " <<endl;
Plik<<" - pulsacja "<< w<<endl;
Plik<<" - amplituda "<< A<<endl;
Plik<<" - liczba krokow "<< n<<endl;
Plik<<" - przedzial a "<< a<<endl;
Plik<<" - przedzial b "<< b<<endl;

Plik<<"Pole figury wynosi metoda trapezowa  : "<<Pole(a, b, n, A, w)<<endl;

Plik<< "Pole figury wynois metoda analityczna "<< analitycznie(A, w, a, b)<<endl;
Plik<< " Blad wzgledny wynosi "<<(Pole(a, b, n, A, w)- analitycznie(A, w, a, b))/analitycznie(A, w, a, b)<<endl;
Plik<< " Blad bezwzgledny wynosi "<<bezwzgledna*100<<"%"<<endl;
system("PAUSE");
return EXIT_SUCCESS;
}

0

Moment, chcesz powiedzieć że dla obliczenia całki metodą trapezów potrzebujesz umieć obliczyć całkę metodą analityczną?
Bo jak nie to co robi to coś: suma_calki+=analitycznie(A, w, xa, xb);

0

W tym momecie to już się sam zapętliłem bo jak robiłem wg zadania to wychodzą jakieś glupoty. W załączniku treść zadania

#include<iostream>
#include<iomanip>
#include<math.h>
#include <cstdlib>
#include <fstream>

using namespace std;

double analitycznie(double A,double w, double a, double b)
{
return (-A/w)(cos(wb)-cos(w*a));
}

double Pole(int a, int b, int n, int A, int w)
{
double
spr=b-a;

double wy;
double h=spr/n;

int j=1;

double xa=0.0;
double xb=0.0;
double suma_calki=0.0;
for (int i=0; i<=n; i++)
{
xa=a+ih;
xb=a+j
h;
suma_calki+=xa+xb;
j++;

  }

 
  return suma_calki*(h/2);

}

int main()
{

int a, b, n, w, A;
cout<<"Podaj pulsacje w "<<endl;
cin >>w;
cout<<"Podaj Amplitude A"<<endl;
cin>>A;
cout<<"Podaj liczbe trapezow: ";
cin>>n;
cout<<"Podaj przedzial a "<<endl;
cin>>a;
cout<<"Podaj przedzial b "<<endl;
cin>>b;

if(!(a<b))
cout<<"To nie jest przedział!";
else
cout<<"Pole figury wynosi metoda trapezowa : "<<Pole(a, b, n, A, w)<<endl;
cout<< "Pole figury wynois metoda analityczna "<< analitycznie(A, w, a, b)<<endl;

double bezwzgledna=(Pole(a, b, n, A, w)- analitycznie(A, w, a, b))/analitycznie(A, w, a, b);

cout<< " Blad wzgledny wynosi "<<(Pole(a, b, n, A, w)- analitycznie(A, w, a, b))/analitycznie(A, w, a, b)<<endl;
cout<< " Blad bezwzgledny wynosi "<<bezwzgledna*100<<"%"<<endl;
fstream Plik;
Plik.open("Dane.txt", ios::out | ios::app);
Plik<<"Dla danych: " <<endl;
Plik<<" - pulsacja "<< w<<endl;
Plik<<" - amplituda "<< A<<endl;
Plik<<" - liczba krokow "<< n<<endl;
Plik<<" - przedzial a "<< a<<endl;
Plik<<" - przedzial b "<< b<<endl;

Plik<<"Pole figury wynosi metoda trapezowa  : "<<Pole(a, b, n, A, w)<<endl;

Plik<< "Pole figury wynois metoda analityczna "<< analitycznie(A, w, a, b)<<endl;
Plik<< " Blad wzgledny wynosi "<<(Pole(a, b, n, A, w)- analitycznie(A, w, a, b))/analitycznie(A, w, a, b)<<endl;
Plik<< " Blad bezwzgledny wynosi "<<bezwzgledna*100<<"%"<<endl;
system("PAUSE");
return EXIT_SUCCESS;
}

0

Witam, czy ktoś jest w stanie dać jakąś wskazówke do rozwiązania zadania

0
  1. Sformatuj kod.
  2. Wklej w znaczniki <code> tu kod </code>
  3. Zastanów się czym jest f() w zadaniu
0

Witam, wstawiłem kod w znaczniki.
Ja rozumiem to zadanie tak:

  1. Rozwiązanie analityczne to scałkowanie funkcji którą mamy w zadaniu i poźniej do niej wpisanie wartości i policzenie całej fukncji.
  2. Rozwiązanie trapezowe jest dla mnie nie za bardzo jasne. Nie wiem czy też mam korzystać z funkcji (-A/w)(cos(wb)-cos(w*a)). Zrobiłem to tak, że policzyłem h, później sumuje podstawy i na końcu mnoże h/2 żeby otrzymać pole.
#include<iostream>
#include<iomanip>
#include<math.h>
#include <cstdlib>
#include <fstream>

using namespace std;
 
double analitycznie(double A,double w, double a, double b)
{
 return (-A/w)*(cos(w*b)-cos(w*a));
}
 
double Pole(int a, int b, int n, int A, int w)
{
double
 spr=b-a;

double wy;
double h=spr/n;

	int j=1;
  double xa=0.0;
  double xb=0.0;
  double suma_calki=0.0;
  for (int i=0; i<=n; i++)
  {
  xa=a+i*h;
  xb=a+j*h;
      suma_calki+=xa+xb;
   j++;
   
      }
 
     
      return suma_calki*(h/2);
}
 
int main()
{
	
  int a, b, n, w, A;
cout<<"Podaj pulsacje w "<<endl;
cin >>w;
cout<<"Podaj Amplitude A"<<endl;
cin>>A;
  cout<<"Podaj liczbe trapezow: ";
  cin>>n;
 cout<<"Podaj przedzial a "<<endl;
 cin>>a;
 cout<<"Podaj przedzial b "<<endl;
 cin>>b;
 
  if(!(a<b))
    cout<<"To nie jest przedział!";
  else
    cout<<"Pole figury wynosi metoda trapezowa  : "<<Pole(a, b, n, A, w)<<endl;
 cout<< "Pole figury wynois metoda analityczna "<< analitycznie(A, w, a, b)<<endl;

 double bezwzgledna=(Pole(a, b, n, A, w)- analitycznie(A, w, a, b))/analitycznie(A, w, a, b);
 
 cout<< " Blad wzgledny wynosi "<<(Pole(a, b, n, A, w)- analitycznie(A, w, a, b))/analitycznie(A, w, a, b)<<endl;
  cout<< " Blad bezwzgledny wynosi "<<bezwzgledna*100<<"%"<<endl;
  fstream Plik;
    Plik.open("Dane.txt", ios::out | ios::app);
    Plik<<"Dla danych: " <<endl;
    Plik<<" - pulsacja "<< w<<endl;
    Plik<<" - amplituda "<< A<<endl;
    Plik<<" - liczba krokow "<< n<<endl;
    Plik<<" - przedzial a "<< a<<endl;
    Plik<<" - przedzial b "<< b<<endl;    

    Plik<<"Pole figury wynosi metoda trapezowa  : "<<Pole(a, b, n, A, w)<<endl;
 Plik<< "Pole figury wynois metoda analityczna "<< analitycznie(A, w, a, b)<<endl;
 Plik<< " Blad wzgledny wynosi "<<(Pole(a, b, n, A, w)- analitycznie(A, w, a, b))/analitycznie(A, w, a, b)<<endl;
  Plik<< " Blad bezwzgledny wynosi "<<bezwzgledna*100<<"%"<<endl;
  system("PAUSE");
    return EXIT_SUCCESS;
} 
0
_13th_Dragon napisał(a):

Zastanów się czym jest f() w zadaniu

w sposobie trapezowym jest to wartość całkowanej funkcji w punkcie xi czyli xi=a+i*h ?

0

A jaka jest całkowana funkcja?

0

Asin(wt)

0

Do trapezowej zrobilem coś takiego. Ma to sens? Powiedzcie mi gdzie w moim toku myślenia jest błąd ?
Tam funkcja nazywa się analitycznie, ale jest to do metody trapezowej.

 #include<iostream>
#include<iomanip>
#include<math.h>
#include <cstdlib>
#include <fstream>

using namespace std;
double analitycznie (double amplituda, double pulsacja, double dx)
 
 {
 	return amplituda*sin(pulsacja*dx);
 }

int main(int argc, char** argv) {
	double pocz, koniec, pulsacja, amplituda, krok;
	
	cout<< "Podaj poczatek przedzialu  "<<endl;
	cin>> pocz;
	cout<< "Podaj koniec przedzialu  "<<endl;
	cin>> koniec;
	cout<<"Podaj amplitude "<<endl;
	cin>>amplituda;
	cout<<" Podaj pulsacje "<<endl;
	cin>>pulsacja;
	cout<<" Liczba krokow "<<endl;
	cin>>krok;
	double suma, dx, i;
	
	suma=0;
	dx=(koniec - pocz)/krok;


	
	for(i=1; i<krok; i++)
	{
		suma=suma +analitycznie(amplituda, pulsacja, pocz+i*dx);
		
	}
	suma= (suma+ (analitycznie(amplituda, pulsacja, pocz)+analitycznie(amplituda, pulsacja, koniec))/2)*dx;
	
	cout<<"Calka wynosi analitycznie "<<suma<<endl;
	return 0;
}#include<iostream>
#include<iomanip>
#include<math.h>
#include <cstdlib>
#include <fstream>

using namespace std;
double analitycznie (double amplituda, double pulsacja, double dx)
 
 {
 	return amplituda*sin(pulsacja*dx);
 }

int main(int argc, char** argv) {
	double pocz, koniec, pulsacja, amplituda, krok;
	
	cout<< "Podaj poczatek przedzialu  "<<endl;
	cin>> pocz;
	cout<< "Podaj koniec przedzialu  "<<endl;
	cin>> koniec;
	cout<<"Podaj amplitude "<<endl;
	cin>>amplituda;
	cout<<" Podaj pulsacje "<<endl;
	cin>>pulsacja;
	cout<<" Liczba krokow "<<endl;
	cin>>krok;
	double suma, dx, i;
	
	suma=0;
	dx=(koniec - pocz)/krok;


	
	for(i=1; i<krok; i++)
	{
		suma=suma +analitycznie(amplituda, pulsacja, pocz+i*dx);
		
	}
	suma= (suma+ (analitycznie(amplituda, pulsacja, pocz)+analitycznie(amplituda, pulsacja, koniec))/2)*dx;
	
	cout<<"Calka wynosi analitycznie "<<suma<<endl;
	return 0;
}
0

Zrobiłem na szybko coś takiego (na szybko bo bez zabezpieczenia podania zlych przedziałów przez użytkownika oraz nie zapisuje wyników do pliku itd). Chodzi o wyniki jedynie czy są dobrze ?

#include<iostream>
#include<iomanip>
#include<math.h>
#include <cstdlib>
#include <fstream>

using namespace std;
double analitycznie (double amplituda, double pulsacja, double dx)
 
 {
 	return amplituda*sin(pulsacja*dx);
 }


double analitycznie22(double A,double w, double a, double b)
{
 return (-A/w)*(cos(w*b)-cos(w*a));
}
int main(int argc, char** argv) {
	double pocz, koniec, pulsacja, amplituda, krok;
	
	cout<< "Podaj poczatek przedzialu  "<<endl;
	cin>> pocz;
	cout<< "Podaj koniec przedzialu  "<<endl;
	cin>> koniec;
	cout<<"Podaj amplitude "<<endl;
	cin>>amplituda;
	cout<<" Podaj pulsacje "<<endl;
	cin>>pulsacja;
	cout<<" Liczba krokow "<<endl;
	cin>>krok;
	double suma, dx, i;
	
	suma=0;
	dx=(koniec - pocz)/krok;

double wynik;
wynik=analitycznie22(amplituda, pulsacja, pocz, koniec);
	
	for(i=1; i<krok; i++)
	{
		suma=suma +analitycznie(amplituda, pulsacja, pocz+i*dx);
		
	}
	suma= (suma+ (analitycznie(amplituda, pulsacja, pocz)+analitycznie(amplituda, pulsacja, koniec))/2)*dx;
	
	cout<<"Calka wynosi trapezowo "<<suma<<endl;
	cout<<"Calaka analitycznie wynosi "<<wynik<<endl;
	return 0;
} 
0
#include <iomanip>
...
cout<<"Calka wynosi trapezowo "<<fixed<<setprecision(16)<<suma<<endl;
0

Czyli jest dobrze trapezowo czy nie?

0

Ojej... ale masz straszny problem.

http://pl.wikipedia.org/wiki/Wz%C3%B3r_trapez%C3%B3w

0

Ojejku może nie straszny, ale już nie wiem co mam zrobić z moją funkcją w całkowaniu trapezowym. Jak mam tam dane przekazać? Mam wykorzystać wzór Asin(w*t) ? I żeby obliczać wartości funkcji przekazywać tam wartości stałe A oraz w oraz zmieniajace się podstawy xi?

0

Zrobiłem wg wzoru i wychodza i podobne wyniki z metoda analityczna. Czy juz jest dobrze?

 	int j=1;
	for(i=0; i<krok; i++)
	{
		suma=trapezowo(amplituda, pulsacja, pocz+i*dx);
		suma1=trapezowo(amplituda, pulsacja, pocz+j*dx);
		j++;
		pole=((suma+suma1)/2)*dx;
		wyniktr+=pole;
	}
0
lukwro napisał(a):

Ojejku może nie straszny, ale już nie wiem co mam zrobić z moją funkcją w całkowaniu trapezowym. Jak mam tam dane przekazać? Mam wykorzystać wzór Asin(w*t) ? I żeby obliczać wartości funkcji przekazywać tam wartości stałe A oraz w oraz zmieniajace się podstawy xi?

Ja bym przekazywał tylko x;

czyli tak:
y = f(x);

a te stałe zrobiłbym globalne.

W tej wersji można całkować dowolne funkcje, bo wystarczy zmieniać sobie definicję tej f.

double f(double x)
{ 
 return x*x * sin(k*x*x); // k jest zmienną globalną
}

No i gotowe - już można sobie to całkować tym samym kodem.

0

Ok rozumiem, zrobiłem już to po swojemu, tylko mam troche inny wynik niż na tej stronie http://um.mendelu.cz/maw-html/index.php?lang=pl&form=trap w liczeniu trapezowym. Błędy też mi wychodzą strasznie małe, ale jak mówicie że jest dobrze to już nie ruszam w poniedziałek oddaje.

 #include<iostream>
#include<iomanip>
#include<math.h>
#include <cstdlib>
#include <fstream>

using namespace std;

double trapezowo (double amplituda, double pulsacja, double dx)

{
    return amplituda*sin(pulsacja*dx);
}



double analitycznie(double A,double w, double a, double b)
{
return (-A/w)*(cos(w*b)-cos(w*a));
}




int main(int argc, char** argv) {
double pocz, koniec, pulsacja, amplituda, krok; //dane do programu
double wynik; //dane sposob analityczny
double suma, dx,suma1,pole,wyniktr; //dane sposob trapezowy
double bezwzgledna; //wynik bezwzgledny
double wzgledny; // wynik wzgledny

/*Podanie danych do zadania*/
   cout<< "Podaj poczatek przedzialu  "<<endl;
   cin>> pocz;
   cout<< "Podaj koniec przedzialu  "<<endl;
   cin>> koniec;
   cout<<"Podaj amplitude "<<endl;
   cin>>amplituda;
   cout<<" Podaj pulsacje "<<endl;
   cin>>pulsacja;
   cout<<" Liczba krokow "<<endl;
   cin>>krok;


/*Sprawdzenie poprawnosci przedzialu*/

if(!(pocz<koniec)){

cout<<"To nie jest poprawny przedzial!";
}
else{

/*Obliczenie analityczne*/


wynik=analitycznie(amplituda, pulsacja, pocz, koniec);

cout<<"Calaka analitycznie wynosi "<<fixed<<setprecision(16)<<wynik<<endl;


/*Obliczenie trapezowe*/


dx=(koniec - pocz)/krok;
   suma=0;
   suma1=0;
wyniktr=0;


int j=1;
   for(int i=0; i<krok; i++)
   {
       suma=trapezowo(amplituda, pulsacja, pocz+i*dx);
       suma1=trapezowo(amplituda, pulsacja, pocz+j*dx);
       j++;
       pole=((suma+suma1)/2)*dx;
       wyniktr+=pole;
   }


cout<<"Calaka trapezowo wynosi "<<fixed<<setprecision(16)<<wyniktr<<endl;

/*Blad bezwzgledny*/
bezwzgledna=(wyniktr-wynik);

cout<< "wynik bezwzgledny wynosi :    "<<fixed<<setprecision(3)<<fabs(bezwzgledna)<<endl;

/*Blad wzgledny*/

wzgledny=(bezwzgledna/wyniktr)*100;
cout<< "wynik wzgledny wynosi :    "<<fixed<<setprecision(3)<<fabs(wzgledny)<<"%"<<endl;

/*Zapis do pliku*/
fstream Plik;
Plik.open("Dane.txt", ios::out | ios::app);
   Plik<<"Dla danych: " <<endl;
   Plik<<" - pulsacja "<<pulsacja<<endl;
   Plik<<" - amplituda "<< amplituda<<endl;
   Plik<<" - liczba krokow "<< krok<<endl;
   Plik<<" - przedzial poczatek "<< pocz<<endl;
   Plik<<" - przedzial koniec "<< koniec<<endl;    

Plik<<"Pole figury wynosi metoda trapezowa  : "<<wyniktr<<endl;
Plik<< "Pole figury wynois metoda analityczna "<<wynik<<endl;

Plik<<" - wynik bezwzgledny wynosi : "<<fixed<<setprecision(3)<< fabs(bezwzgledna)<<endl;  
Plik<<" - wynik wzgledny wynosi : "<<fixed<<setprecision(3)<< fabs(wzgledny)<<"%"<<endl;  
}
   return 0;
} 
0

Jak są różnice to coś jest nie halo. Głębiej to nie chce mi się analizować bo wciąż nie sformatowałeś kodu.

0
fur napisał(a):
lukwro napisał(a):

Ojejku może nie straszny, ale już nie wiem co mam zrobić z moją funkcją w całkowaniu trapezowym. Jak mam tam dane przekazać? Mam wykorzystać wzór Asin(w*t) ? I żeby obliczać wartości funkcji przekazywać tam wartości stałe A oraz w oraz zmieniajace się podstawy xi?

Ja bym przekazywał tylko x;

czyli tak:
y = f(x);

a te stałe zrobiłbym globalne.

W tej wersji można całkować dowolne funkcje, bo wystarczy zmieniać sobie definicję tej f.

double f(double x)
{ 
 return x*x * sin(k*x*x); // k jest zmienną globalną
}

No i gotowe - już można sobie to całkować tym samym kodem.

double f(double x)
{ 
 return A* sin(w*x); // A i w jest zmienną globalną
}

Nie rozumiem czemu wszedzie dałeś x nie powinno być tak dla mojej funkcji?

0
_13th_Dragon napisał(a):

Jak są różnice to coś jest nie halo. Głębiej to nie chce mi się analizować bo wciąż nie sformatowałeś kodu.

Bardzo chętnie sformatuje kod tylko nie wiem jak? Myślałem że chodzi o wstawienie w znaczniki c++. Zależy mi na poprawnym działaniu programu i chciałbym go wykonać na 100% dobrze.

0

Dodałem komentarze i paragrafy, jeśli nadal jest źle przepraszam ;/

 #include<iostream>
#include<iomanip>
#include<math.h>
#include <cstdlib>
#include <fstream>

using namespace std;

double trapezowo (double amplituda, double pulsacja, double dx) //funkcja do calkowania trapezowgo

	{
   		 return amplituda*sin(pulsacja*dx);
	}



double analitycznie(double A,double w, double a, double b)  // funkcja analityczna


	{
	return (-A/w)*(cos(w*b)-cos(w*a));
	}




int main(int argc, char** argv) {
	
	
		double pocz, koniec, pulsacja, amplituda, krok; //dane do programu pocz- poczatek przedzialu, koniec - koniec przedzialu, 
		double wynik; //dane sposob analityczny
		double suma, dx,suma1,pole,wyniktr; //dane sposob trapezowy
		double bezwzgledna; //wynik bezwzgledny
		double wzgledny; // wynik wzgledny

/*Podanie danych do zadania*/
   cout<< "Podaj poczatek przedzialu  "<<endl;
   cin>> pocz;
   cout<< "Podaj koniec przedzialu  "<<endl;
   cin>> koniec;
   cout<<"Podaj amplitude "<<endl;
   cin>>amplituda;
   cout<<" Podaj pulsacje "<<endl;
   cin>>pulsacja;
   cout<<" Liczba krokow "<<endl;
   cin>>krok;


/*Sprawdzenie poprawnosci przedzialu*/

if(!(pocz<koniec))

	{

		cout<<"To nie jest poprawny przedzial!";
					}
		else
		{

/*Obliczenie analityczne*/


wynik=analitycznie(amplituda, pulsacja, pocz, koniec);

cout<<"Calaka analitycznie wynosi "<<fixed<<setprecision(16)<<wynik<<endl;


/*Obliczenie trapezowe*/


		dx=(koniec - pocz)/krok;  // wysokosc pojedynczego trapezu
 		  suma=0;
 		  suma1=0;
		wyniktr=0;


int j=1;
   for(int i=0; i<krok; i++)
 	
	   {
	   	
       suma=trapezowo(amplituda, pulsacja, pocz+i*dx);  //wynik dla  xi 
       suma1=trapezowo(amplituda, pulsacja, pocz+j*dx); // wynik dla x1+1
       j++;
       pole=((suma+suma1)/2)*dx;
       wyniktr+=pole;
       
 	  }


cout<<"Calaka trapezowo wynosi "<<fixed<<setprecision(16)<<wyniktr<<endl;

/*Blad bezwzgledny*/
bezwzgledna=(wyniktr-wynik);

cout<< "wynik bezwzgledny wynosi :    "<<fixed<<setprecision(3)<<fabs(bezwzgledna)<<endl;

/*Blad wzgledny*/

wzgledny=(bezwzgledna/wyniktr)*100;
cout<< "wynik wzgledny wynosi :    "<<fixed<<setprecision(3)<<fabs(wzgledny)<<"%"<<endl;

/*Zapis do pliku*/
fstream Plik;
Plik.open("Dane.txt", ios::out | ios::app);
   Plik<<"Dla danych: " <<endl;
   Plik<<" - pulsacja "<<pulsacja<<endl;
   Plik<<" - amplituda "<< amplituda<<endl;
   Plik<<" - liczba krokow "<< krok<<endl;
   Plik<<" - przedzial poczatek "<< pocz<<endl;
   Plik<<" - przedzial koniec "<< koniec<<endl;    

Plik<<"Pole figury wynosi metoda trapezowa  : "<<wyniktr<<endl;
Plik<< "Pole figury wynois metoda analityczna "<<wynik<<endl;

Plik<<" - wynik bezwzgledny wynosi : "<<fixed<<setprecision(3)<< fabs(bezwzgledna)<<endl;  
Plik<<" - wynik wzgledny wynosi : "<<fixed<<setprecision(3)<< fabs(wzgledny)<<"%"<<endl;  
}
   return 0;
}
0

Ok może nie będę wklejał po raz kolejny całego kodu, tylko część której nie jestem pewien, a mianowicie całkowanie trapezowe funkcji Asin(wt)

funkcja zewnętrzna do której się odwołuje

 double trapezowo (double amplituda, double pulsacja, double dx) //funkcja do calkowania trapezowgo

	{
   		 return amplituda*sin(pulsacja*dx);
	}

Program który napisałem do liczenia trapezowego

/*Obliczenie trapezowe*/


		dx=(koniec - pocz)/krok;  // wysokosc pojedynczego trapezu
 		  suma=0;
 		  suma1=0;
		 wyniktr=0;


int j=1;
   
for(int i=0; i<krok; i++)
 	
	   {
	   	
       suma=trapezowo(amplituda, pulsacja, pocz+i*dx);  //wynik dla  xi 
       suma1=trapezowo(amplituda, pulsacja, pocz+j*dx); // wynik dla x1+1
       j++;
       pole=((suma+suma1)/2)*dx;
       wyniktr+=pole;
       
 	  } 
0
lukwro napisał(a):

Nie rozumiem czemu wszedzie dałeś x nie powinno być tak dla mojej funkcji?

To była przykładowa funkcja, znaczy inna.

Poza tym 'trapezowo' to raczej dość durnowata nazwa na funkcję.

Cała ta metoda jest 'trapezowa' a nie ten zasrany sin.

Sam algorytm też raczej dziwnie wygląda w twoim wydaniu... chyba do d**y jest. :)

0
fur napisał(a):
lukwro napisał(a):

Nie rozumiem czemu wszedzie dałeś x nie powinno być tak dla mojej funkcji?

To była przykładowa funkcja, znaczy inna.

Poza tym 'trapezowo' to raczej dość durnowata nazwa na funkcję.

Cała ta metoda jest 'trapezowa' a nie ten zasrany sin.

Sam algorytm też raczej dziwnie wygląda w twoim wydaniu... chyba do d**y jest. :)

Chyba ? Czy jest źle?

0

Oczywiście że chyba bo analizować taki bubel na dodatek nie sformatowany to nikt nie chce.

0

Wstawiam trochę inaczej sformatowane, jeśli znowu będzie źle to się poddaje. Najpierw funkcja do której przekazuje dane.
Niżej kod liczący metodą trapezową. Może opisze trochę jak ja to rozumiem. Zmienna dx wylicza mi wysokość pojdenczego trapezu w zależności od przedziałów i liczby kroków. Następnie chce uzyskać dwie wartości którymi są podstawy trapezów, od tego są zmienne:
suma= podstawa a
suma1= podstawa b
Na samym końcu wyliczam pole.

 double trapezowo (double amplituda, double pulsacja, double dx) //funkcja do calkowania trapezowgo
 
    {
            return amplituda*sin(pulsacja*dx);
    }
 
/*Obliczenie trapezowe*/
 
 
        dx=(koniec - pocz)/krok;  // wysokosc pojedynczego trapezu
           suma=0;
           suma1=0;
         wyniktr=0;
 
 
int j=1;
 
for(int i=0; i<krok; i++)
 
  {
 
       suma=trapezowo(amplituda, pulsacja, pocz+i*dx);  //wynik dla  xi 
       suma1=trapezowo(amplituda, pulsacja, pocz+j*dx); // wynik dla x1+1
       j++;
       pole=((suma+suma1)/2)*dx;
       wyniktr+=pole;
 

   
 } 
 
0

Dobra chłopaki zrobiłem ten program, wyniki się zgadzają z kalkulatorem. Nie będę już wklejał bo nadal nie umiem formatować, a nie mam visaul studio.

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