Metody numeryczne

/* MetodaProstokatow.java */

public class MetodaProstokatow
{
  public static void main(String[] args)
  {
    int n = 100; // liczba podziałów
    
    double a = 0;
    double b = Math.PI;
    
    double krok = (b - a) / n;
    double x = a + krok;
    
    double suma = 0;
    for (int i = 1; i <= n; i++)
    {
      suma = suma + f(x);
      x = x + krok;
    }
    
    double pole = krok*suma;
    
    System.out.println("pole = " + pole);
  }

  static double f(double x)
  {
    return Math.sin(x);
  }
}
pole = 1.9998355038874451
Press any key to continue...
/* MetodaTrapezow.java */

public class MetodaTrapezow
{
  public static void main(String[] args)
  {
    int n = 100; // liczba podziałów

    double a = 0;
    double b = 1;
    
    double krok = (b - a) / n;
    double x = a + krok;
    
    double suma = 0;
    for (int i = 1; i <= n - 1; i++)
    {
      suma = suma + f(x);
      x = x + krok;
    }
    
    double pole = 0.5*krok*(f(a) + f(b) + 2*suma);
    
    System.out.println("pole = " + pole);
  }

  static double f(double x)
  {
    return x*x + 2*x;
  }
}
pole = 1.3333500000000007
Press any key to continue...
/* MetodaBisekcji.java */

public class MetodaBisekcji
{
  public static void main(String[] args) throws Exception
  {
    int maxLiczbaKrokow = 100;
    
    double a = -0.9;
    double b = 2.5;
    double e = 0.001;
    
    if (f(a)*f(b) > 0) throw new Exception("nie spelnione zalozenia");
    
    double s = (a + b) / 2;
    
    if (Math.abs(f(a)) <= e) s = a;
    if (Math.abs(f(b)) <= e) s = b;
    
    int krok = 1;
    
    while (Math.abs(f(s)) > e)
    {
      krok++; if (krok > maxLiczbaKrokow) break;
      
      if (f(b)*f(s) > 0) b = s;
      if (f(a)*f(s) > 0) a = s;
      
      s = (a + b) / 2;
    }
    
    if (krok > maxLiczbaKrokow)
    {
      System.out.println("nie znaleziono rozwiazania");
    }
    else
    {
      System.out.println("liczba krokow = " + krok);
      System.out.println("f(" + s + ") = " + f(s));
    }
  }
  
  static double f(double x)
  {
    return x*x - 1;
  } 
}
liczba krokow = 12
f(1.0000488281250002) = 9.7658634186093E-5
Press any key to continue...
/* MetodaSiecznych.java */

public class MetodaSiecznych
{
  public static void main(String[] args) throws Exception
  {
    int maxLiczbaKrokow = 100;
    
    double a = 1;
    double b = 2;
    double e = 0.0001;

    if (f(a)*f(b) > 0) throw new Exception("nie spelnione zalozenia");
    
    double x = a - f(a)*(b - a) / (f(b) - f(a));
    
    if (Math.abs(f(a)) <= e) x = a;
    if (Math.abs(f(b)) <= e) x = b;
    
    int krok = 1;
    
    while (Math.abs(f(x)) > e)
    {
      krok++; if (krok > maxLiczbaKrokow) break;
      
      if (f(a)*f(x) > 0) a = x;
      if (f(b)*f(x) > 0) b = x;
      
      x = a - f(a)*(b - a) / (f(b) - f(a));
    }
    
    if (krok > maxLiczbaKrokow)
    {
      System.out.println("nie znaleziono rozwiazania");
    }
    else
    {
      System.out.println("liczba krokow = " + krok);
      System.out.println("f(" + x + ") = " + f(x));
    }
  }
  
  static double f(double x)
  {
    return x*x + Math.sin(x*x*x - x + 2) - x - 1;
  } 
}
liczba krokow = 12
f(1.782171119379167) = -2.967370901885147E-6
Press any key to continue...
/* MetodaStycznych.java */

public class MetodaStycznych
{
  public static void main(String[] args) throws Exception
  {
    int maxLiczbaKrokow = 100;

    double e = 0.0001;
    double x = 1;

    x = x - f(x) / df(x,e);
    
    int krok = 1;
    
    while (Math.abs(f(x)) > e)
    {
      krok++; if (krok > maxLiczbaKrokow) break;
      
      x = x - f(x) / df(x,e);
    }
    
    if (krok > maxLiczbaKrokow)
    {
      System.out.println("nie znaleziono rozwiazania");
    }
    else
    {
      System.out.println("liczba krokow = " + krok);
      System.out.println("f(" + x + ") = " + f(x));
    }
  }
  
  static double df(double x, double e)
  {
    return (f(x + e) - f(x)) / e;
  } 
  
  static double f(double x)
  {
    return x*x + Math.sin(x*x*x - x + 2) - x - 1;
  } 
}
liczba krokow = 7
f(1.7821740018798686) = 2.7019482316870125E-5
Press any key to continue...

Strona główna