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...