Salem 363 Napisano 29 Listopada 2012 Udostępnij Napisano 29 Listopada 2012 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ć. Cytuj Link to post Share on other sites
Malwin 16 Napisano 29 Listopada 2012 Udostępnij Napisano 29 Listopada 2012 (edytowane) 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 29 Listopada 2012 przez Malwin 1 Cytuj Link to post Share on other sites
Salem 363 Napisano 29 Listopada 2012 Autor Udostępnij Napisano 29 Listopada 2012 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ć Cytuj Link to post Share on other sites
Malwin 16 Napisano 29 Listopada 2012 Udostępnij Napisano 29 Listopada 2012 Dobra nie zrozumieliśmy się w drugim masz kod, a do pierwszego potrzeba Ci schemat blokowy a nie kod? Z resztą nie ważne czy schemat czy kod na podstawie tego co napisałem zorientujesz się jak to działa i jak zapisać. 1 Cytuj Link to post Share on other sites
Salem 363 Napisano 29 Listopada 2012 Autor Udostępnij Napisano 29 Listopada 2012 Do pierwszego tylko schemat mam mieć, czy ten co podałem jest w porządku? Za drugie dziękuję serdecznie! Cytuj Link to post Share on other sites
Malwin 16 Napisano 29 Listopada 2012 Udostępnij Napisano 29 Listopada 2012 (edytowane) 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 29 Listopada 2012 przez Malwin 1 Cytuj Link to post Share on other sites
Salem 363 Napisano 29 Listopada 2012 Autor Udostępnij Napisano 29 Listopada 2012 OK, dzięki serdeczne, już załapałem Cytuj Link to post Share on other sites
Malwin 16 Napisano 29 Listopada 2012 Udostępnij Napisano 29 Listopada 2012 Oczywiście mała pomyłka była u mnie, zbyt się pośpieszyłem przy pisaniu tam ma być wartość funkcji. Już to poprawiłem Cytuj Link to post Share on other sites
Salem 363 Napisano 29 Listopada 2012 Autor Udostępnij Napisano 29 Listopada 2012 Udało mi się to jakoś zauważyć Cytuj Link to post Share on other sites
Recommended Posts
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ą.