Advertisement
Guest User

Untitled

a guest
Apr 23rd, 2014
41
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 3.07 KB | None | 0 0
  1. package lab06;
  2.  
  3. import java.util.logging.Level;
  4. import java.util.logging.Logger;
  5.  
  6. class Calka extends Thread{    
  7.    
  8.     //poczatek, koniec, wynik, ile watkow, ile podprzedzialow
  9.     private double dx, xp, xk, cal;
  10.     private int n,p,ileNaWatek,reszta;
  11.     boolean ostatni;
  12.    
  13.     //funkcja którą liczymy
  14.     private double funkcja(double x) {
  15.     return 1.0/(1.0+x*x);
  16.     }
  17.     //metoda trapezów
  18.     public double metoda_trapezow(double xp, double xk){
  19.             return (funkcja(xp) + funkcja(xk)) * (xk - xp)/2;
  20.         }
  21.     //wynik
  22.     public double wynik(){
  23.             return cal;
  24.     }
  25.     //konstruktor z parametrami, poczatek i koniec przedzialu
  26.     public Calka(int n,int p,double dx,double xp,double xk, int ileNaWatek, int reszta,boolean ostatni){
  27.         this.n = n;
  28.         this.p = p;
  29.         this.dx = dx;
  30.         this.xp = xp;
  31.         this.ileNaWatek = ileNaWatek;
  32.         this.xk = xk;
  33.         this.reszta = reszta;
  34.         this.ostatni = ostatni;
  35.        
  36.     }
  37.    
  38.     @Override
  39.         public void run(){
  40.  
  41.         if(ostatni==true)
  42.         {
  43.             for (int i=0;i<p/n;i++)
  44.             {
  45.                 this.cal += metoda_trapezow(i*dx+xp, (i+1)*dx+xp+reszta*dx);
  46.             }
  47.         }
  48.         else
  49.         {
  50.             for (int i=0;i<p/n;i++)
  51.             {
  52.                 this.cal += metoda_trapezow(i*dx+xp, (i+1)*dx+xp);
  53.             }
  54.         }
  55.        
  56.     }
  57. }
  58. public class Lab06 {
  59.  
  60.     public static void main(String[] args) {
  61.         int n = 3; //ilość watków
  62.         int p = 1000; //ilosc przedzialów
  63.         System.out.println("Wąteczki: "+n);
  64.         System.out.println("Podprzedziałki: "+p);
  65.         Calka[] calki = new Calka[n]; //tablica na wyniki przedzialów
  66.         double xp = 0; //poczatek
  67.         double xk = 1;  //koniec
  68.         double calka = 0; //wynik
  69.        
  70.         int ileNaWatek = p/n;
  71.         int reszta = p%n;
  72.          
  73.         double dx = (xk - xp) / p;
  74.        
  75.         //każdy proces liczy tylko swój podprzedział
  76.         //n procesów kolejno liczy coraz dalsze sumy podprzedziałów
  77.         boolean ostatni=false;
  78.        
  79.         for (int i=0; i<n; i++) {
  80.             if(i==n-1)
  81.             {
  82.                 ostatni = true;
  83.                 calki[i] = new Calka(n,p,dx,xp,xk,ileNaWatek,reszta,ostatni);
  84.                 calki[i].start();
  85.             }
  86.             else
  87.             {
  88.                 calki[i] = new Calka(n,p,dx,xp,xk,ileNaWatek,reszta,ostatni);
  89.                 calki[i].start();
  90.             }
  91.         }
  92.        
  93.         for (int i = 0 ; i < n ; i++) {
  94.             try {
  95.                 calki[i].join();
  96.             } catch (InterruptedException ex) {
  97.                 Logger.getLogger(Lab06.class.getName()).log(Level.SEVERE, null, ex);
  98.             }
  99.             //zliczenie wyników, wypisanie ID wątku
  100.             System.out.println("Wątek "+(i%8+1)+": " + calki[i].wynik());
  101.             calka += calki[i].wynik();
  102.         }
  103.          calka = 4*calka; //mnożymy calke razy 4
  104.          System.out.println("Wynik: " + calka);
  105.     }
  106. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement