mario445
Dołączył: 18 Gru 2007 Posty: 57
Przeczytał: 0 tematów
Pomógł: 2 razy Ostrzeżeń: 0/5
|
Wysłany: Czw 21:43, 10 Mar 2011 Temat postu: |
|
|
Kod: |
import java.util.*;
public class Fcj{
static double epsM;
static void Fcj(){
double a = 1;
double b = 1;
while (a + b != 1)
b *= 0.5;
epsM = b * 2.0;
}
static int licznik = 0;
static double F(double x, double y){
licznik++;
return Math.min(Math.sqrt(x*x + y*y) - 0.5,
Math.abs(Math.abs(x - 0.5) -y + 0.5) - 0.25);
}
//wektor [0.5 1]
static double f1(double t){
double x = 0.5*t/Math.sqrt(1.25);
double y = t/Math.sqrt(1.25);
return Math.abs(F(x, y));
}
//wektor [1 0.5]
static double f2(double t){
double x = t/Math.sqrt(1.25);
double y = 0.5*t/Math.sqrt(1.25);
return Math.abs(F(x, y));
}
static double eps = 0.000001;
static void icheck1(double left, double right, double vLeft, double vRight){
double dlt = right - left;
if (dlt <= eps && vLeft < eps && vRight < eps){
System.out.println("left = " + left + " right = " + right);
System.out.println("X: Left = " + left/Math.sqrt(1.25) + ", Right = " + right/Math.sqrt(1.25));
System.out.println("Y: Left = " + 0.5*left/Math.sqrt(1.25) + ", Right = " + 0.5*right/Math.sqrt(1.25));
}
else{
double cent = (right + left) * 0.5;
double vCenter = f1(cent);
dlt = dlt * 0.5 - vCenter+epsM;
if (vLeft <= dlt) icheck1(left, cent, vLeft, vCenter);
if (vRight <= dlt) icheck1(cent, right, vCenter, vRight);
}
}
static void icheck2(double left, double right, double vLeft, double vRight){
double dlt = right - left;
if (dlt <= eps && vLeft < eps && vRight < eps){
System.out.println("left = " + left + " right = " + right);
System.out.println("X: Left = " + left/Math.sqrt(1.25) + ", Right = " + right/Math.sqrt(1.25));
System.out.println("Y: Left = " + 0.5*left/Math.sqrt(1.25) + ", Right = " + 0.5*right/Math.sqrt(1.25));
}
else{
double cent = (right + left) * 0.5;
double vCenter = f2(cent);
dlt = dlt * 0.5 - vCenter+epsM;
if (vLeft <= dlt) icheck2(left, cent, vLeft, vCenter);
if (vRight <= dlt) icheck2(cent, right, vCenter, vRight);
}
}
static void Check(double left, double right){
System.out.println("Pierwsza prosta [0.5 1]");
icheck1(left, right, f1(left), f1(right));
System.out.println("\nDruga prosta [1 0.5]");
icheck2(left, right, f2(left), f2(right));
}
public static void main(String[] args){
Check(0, Math.sqrt(1.25));
System.out.println("\nPotrzeba "+licznik+" wartości funkcji");
}
}
|
Czy mógłby mi ktoś powiedzieć dlaczego ten kod ("przerobiony" z tego co nadroj wrzucil na jave) zwraca mi tylko jeden wynik??? tzn:
Kod: |
Pierwsza prosta [0.5 1]
Druga prosta [1 0.5]
left = 0.5590169943749475 right = 0.5590175274950975
X: Left = 0.5, Right = 0.5000004768371582
Y: Left = 0.25, Right = 0.2500002384185791
Potrzeba 38 wartości funkcji
|
Post został pochwalony 0 razy
|
|