Skocz do zawartości

[C++] Pomoc w algorytmach iteracyjnych


Recommended Posts

Mam taki problem,

http://img577.imageshack.us/img577/2442/schematblokowy.jpg

Jest podany schemat blokowy do obliczania pola obszaru ograniczonego wykresem funkcji na podstawie prostokątów ( zał. "schemat blokowy " ), mam go przekształcić tak by obliczał pole obszaru ograniczonego wykresem funkcji metodą trapezów. Wiem, że mając wzór na pole trapezu ((a+b)*h)/2, h będzie moim d ze schematu, ale nie wiem jak zapisać moje a i b ze wzoru. Bo skoro x jest jedną z podstaw trapezu to jak zapisać tą drugą podstawę?

 

Kolejnym problemem jest zadanie :

Wykorzystując metodę Monte Carlo, oblicz pole obszaru ograniczonego wykresem funkcji y=x^2, prostymi x=0, x=1 oraz osią OX.

 

mam tylko program do obliczania liczby pi tą metodą :

 

#include <iostream>
#include <cstdio>
#include <cstdlib>
using namespace std;

int main ()
{
double a,b;
long T=0;
long R;
long ilosc;
srand (time(NULL));
cout<<"na podst. ilu punktow znalezc wartosc pi?";
cin>>ilosc;

for(R=0; R<ilosc; R++)
{
a=(double)rand()/(RAND_MAX);
b=(double)rand()/(RAND_MAX);
if(a*a+b*b<=1) T++;
}
cout<<"liczba pi ma wartosc : " <<(double)(4*T)/R;

cin.ignore();
getchar();
return 0;
}

i nie wiem jak to przekształcić.

Link to post
Share on other sites

Co do pierwszego zapisze to w pseudokodzie :

 

double pole = 0.0
double d = (b-a)/n
for i < n , i++
double += ((wartosc(a) +wartosc(a+d)) * d )) / 2;
a += d;

wartosc - to osobna funkcja ktora dla danej funkcji liczy wartosc w danym punkcie. zalozmy ze dla funicji x^2 liczysz pole to funkcja wartosc ma postac :

double wartosc(double x) {
return x*x;
Co do samej metody chodzi o to ze masz podany poczatek funkcji koniec funkcji i ilosc krokow(dokladnosc). Z tego wyliczasz dlugosc kroku. Np jak masz przedzial od 0 do 10 i n=20 to dl kroku wynosi 0,5 i liczysz wtedy 20 pol. W pierwszym kroku liczysz pole pierwszego pola gdzie y(a) to a we wzorze y(a + 0,5) bo 0,5 w tym wypadku wynosi krok to b we wzorze natomiast h to po prostu dlugosc kroku. Zapamietujesz wartosc pola i liczysz kolejne ktore zaczyna sie w y(a+0,5) a konczy w y(a+0,5 + 0,5) itd.

 

Drugie ( zmodyifkowałem kod który tu wkleiłeś):

 

#include <iostream>
#include <cstdio>
#include <cstdlib>
using namespace std;

int main ()
{
double x,y;
long T=0;
long R;
long ilosc;
srand (time(NULL));
cout<<"na podst. ilu punktow znalezc wartosc pola?";
cin>>ilosc;

for(R=0; R<ilosc; R++) {
x=(double)rand()/(RAND_MAX);
y=(double)rand()/(RAND_MAX);
if(y <= x*x) T++;
}

cout<<"Pole : " << (double)T/R;

cin.ignore();
getchar();
return 0;
}
Edytowane przez Malwin
  • Popieram 1
Link to post
Share on other sites

te pierwsze zrobione, chyba tak?

http://img341.imageshack.us/img341/1981/schemat2.jpg

 

a w tym drugim, to mi się wydaje, że wytłumaczyłeś mi metodę z trapezami a tu chodzi o Monte Carlo czyli te kropeczki na kartce ( czy coś takiego), więc dalej nie potrafię tego zrobić :(

Link to post
Share on other sites

Pierwsze nie jest zbyt dobrze bo : P = P + x powinno być wtedy to ma sens bo dodaje kolejne pola trazpezu do siebie, a samo liczenie x powinno troche inaczej wygladać.

 

Nie bardzo mogę odczytać pismo xD więc zakładam, że na górze masz d = (b-a)/n i dalej będę używał "d" to wyliczenie x powinno wyglądać :

 

x = ((F(a+d*k) + F(a+d*(k+1))) * d )) /2

 

Dla k = 0 wyglada to : ((F(a) + F(a*d))*d) / 2

Dla k = 1 ((F(a+d) + F(a*d*2))*d) / 2

 

Działa to bo musisz przesuwać zarówno początek jak i koniec trapezu. W twoim rozwiązaniu tylko przesuwasz koniec + brakuje nawiasów.

Edytowane przez Malwin
  • Popieram 1
Link to post
Share on other sites

Dołącz do dyskusji

Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.

Gość
Odpowiedz w tym wątku...

×   Wklejono zawartość z formatowaniem.   Usuń formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Odnośnik został automatycznie osadzony.   Przywróć wyświetlanie jako odnośnik

×   Przywrócono poprzednią zawartość.   Wyczyść edytor

×   Nie możesz bezpośrednio wkleić grafiki. Dodaj lub załącz grafiki z adresu URL.

  • Ostatnio przeglądający   0 użytkowników

    Brak zarejestrowanych użytkowników przeglądających tę stronę.

×
×
  • Dodaj nową pozycję...