Skocz do zawartości
cZaJn!k

Obliczania miejsca zerowego funkcji przy użyciu kilku wątków procesora

Rekomendowane odpowiedzi

Program o którym mowa w temacie, to nic innego jak C++ z wykorzystaniem bibliotek OpenMP.

Ma on za zadanie obliczać miejsce zerowe jakiejkolwiek funkcji (wykorzystałem "wbudowana" w kod programu) wykorzystując jednocześnie *"potencjał" naszego procesora. Głównym zadaniem tego programu jest zmierzenie czasu (w milisekundach), w którym następują obliczenia przy użyciu 1,2,3,4 wątków itd. Ilość wykorzystywanych wątków może być zmieniana bezpośrednio w kodzie programu.

 

Teraz najważniejsze pytanie.. jak to zrobić, żeby działało ok?

Posiadam program obliczający miejsce zerowe metodą siecznych. Wykorzystana funkcja ma postać a+sin(bx)+c

 

#include <stdio.h>#include <math.h>        //wymagane dla funkcji sin() i M_PI#include <stdlib.h>        //wymagane dla funckji atof() float a, b, c, p, k; double f(double z){        return (a*sin(b*z)+c); //funkcja obliczajaca wartosci rownania} double x(double q, double w){        return (w-(f(w)*(w-q))/(f(w)-f(q))); //funkcja obliczajaca xi+1} int isNumber(char *t) //funkcja sprawdzajaca poprawnosc danych{     int tac = 0;     while(t[tac] != 0)     {         if (!(t[tac] == 45 || t[tac] == 46 || ( t[tac] >= 48 && t[tac] <= 57 )))         {             return 0;         }         tac++;     }     return 1; } int main(){        int n = 1;        //numer pierwszej iteracji        double xmin, xakt, xplus;        //xmin=x0 (xi-1); xakt=x1 (xi); xplus=xi+1;        printf ("\nRozwiazywanie rownania a*sin(bx)+c=0. \nPodaj wspolczynniki a, b, c (oddzielone spacjami): ");         char ta[128], tb[128], tc[128];     scanf("%s %s %s", ta, tb, tc); //wczytywanie danych do tablic w celu sprawdzenia poprawnosci     if (isNumber(ta) != 1 || isNumber(tb) != 1 || isNumber(tc) != 1) //spr. czy dane sa poprawne    {         printf("\nBlad! Parametr nie jest liczba!\n");         return -1;     }      a = atof(ta);     b = atof(tb);     c = atof(tc);        //konwersja stringow na floaty         printf ("Podaj poczatek i koniec przedzialu (w stopniach, oddzielone spacjami): ");         char tp[128], tk[128];     scanf("%s %s", tp, tk);      if (isNumber(tp) != 1 || isNumber(tk) != 1)     {         printf("\nBlad! Przedzial nie jest liczba!\n");         return -1;     }      p = atof(tp);     k = atof(tk);        //konwersja stringow na floaty         if (p == k)        //wtedy w trakcie funkcji x nastepuje dzielenie przez 0        {                printf ("\nBlad! p nie moze byc rowne k!\n");                return 1;        }          if ((a==0 || b==0) && c==0)        //wtedy wykres to prosta y = 0        {                printf ("\nRownanie jest spelnione dla kazdego rzeczywistego x.\n");                return 2;        }         if ((a==0 || b==0) && c!=0)        //wtedy wykres to prosta y != 0        {                printf ("\nRownanie nie jest spelnione dla zadnego x.\n");                return 3;        }         if ((a>0 & c>0 && c>a) || (a<0 & c>0 && c>-a) || (a>0 & c<0 && -c>a) || (a<0 & c<0 && -c>-a))        // wtedy wykres nie ma przeciec z osia x        {                printf ("\nRownanie nie jest spelnione dla zadnego x.\n");                return 4;        }         xmin = p*M_PI/180;        xakt = k*M_PI/180;        xplus = x(xmin, xakt);        //przypisanie x-om odpowiednich wartosci         while (fabs(xplus-xakt) > 0.001)        {                n++;        //zwiekszenie numeru iteracji                xmin = xakt;                xakt = xplus;                xplus = x(xmin, xakt);        //przejscie do kolejnej iteracji - zmiana wartosci x-ow        }         printf ("\nRownanie jest spelnione dla x = %lf stopni. Liczba iteracji: %d.\n", xakt*180/M_PI, n);        printf ("%lf", f(xakt));        //debug        return 0;}

Mój problem polega na zastosowaniu bibliotek OpenMP w tym programie..

mówiąc krótko, nie wiem od której strony się za to zabrać i :mur:

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

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ść
Dodaj odpowiedź do tematu...

×   Wklejono zawartość z formatowaniem.   Przywróć 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.

Ładowanie


×
×
  • Dodaj nową pozycję...