nadroj
Dołączył: 23 Paź 2010 Posty: 14
Przeczytał: 0 tematów
Ostrzeżeń: 0/5
|
Wysłany: Wto 16:46, 08 Mar 2011 Temat postu: |
|
|
Rozwiazanie zadania 2 z kola w oparciu o program napisany przez Gdale:
Kod: |
using System;
namespace zad_gdala
{
class MainClass
{
static double epsM;
static MainClass()
{
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);
}
//wektro [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)
{
Console.WriteLine("left = " + left + " right = " + right);
Console.WriteLine("X: Left = " + left/Math.Sqrt(1.25) + ", Right = " + right/Math.Sqrt(1.25));
Console.WriteLine("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)
{
Console.WriteLine("left = " + left + " right = " + right);
Console.WriteLine("X: Left = " + left/Math.Sqrt(1.25) + ", Right = " + right/Math.Sqrt(1.25));
Console.WriteLine("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)
{
Console.WriteLine("Pierwsza prosta [0.5 1]");
icheck1(left, right, f1(left), f1(right));
Console.WriteLine("\nDruga prosta [1 0.5]");
icheck2(left, right, f2(left), f2(right));
}
static void Main(string[] args)
{
Check(0, Math.Sqrt(1.25));
Console.WriteLine("\nPotrzeba "+licznik+" wartości funkcji");
Console.ReadLine();
}
}
}
|
Krotkie wyjasnienie:
1. Nalezalo stworzyc dwie funkcje f po jednej dla kazdej prostej, pamietajac ze parametr t z funkcji f trzeba przeskalowac (w tym wypadku o pierwastek z 1.25)
2. Nastepnie utworzyc dwie funkcje icheck, po jednej dla kazdej prostej i wywolac je z odpowiednimi funkcjami f. Funkcje icheck skopiowalem bo wewnatrz jej jest wywolywalna funkcja f do obliczenia wartosci dla punktu srodkowego (@SzymonM tu pewnie miales blad i nie uzwgledniles zmiany funcji, stad 4 wyniki)
Program wypluwa:
Kod: |
Pierwsza prosta [0.5 1]
left = 0,499999527532968 right = 0,500000060653118
X: Left = 0,447213172912598, Right = 0,447213649749756
Y: Left = 0,223606586456299, Right = 0,223606824874878
Druga prosta [1 0.5]
[code]left = 0,499999527532968 right = 0,500000060653118[/code]
X: Left = 0,447213172912598, Right = 0,447213649749756
Y: Left = 0,223606586456299, Right = 0,223606824874878
left = 0,559016994374947 right = 0,559017527495097
X: Left = 0,5, Right = 0,500000476837158
Y: Left = 0,25, Right = 0,250000238418579
Potrzeba 70 wartości funkcji
|
Jak to interpretowac?
Dla kazdej prostej program znajduje przedzialy wartosci, w ktory znajduje sie potencjalne rozwiazanie np.:
Kod: |
left = 0,499999527532968 right = 0,500000060653118
|
To jest odpowiednio lewy i prawy koniec przedzialu. Wynik ten nalezy przesksztalcic tak, by wyznaczyc parametry x i y. W programie przksztalcenie nastepuje tuz przed wypisaniem i robi sie to tak samo jak w funkcji f. Efekt:
Kod: |
X: Left = 0,447213172912598, Right = 0,447213649749756
Y: Left = 0,223606586456299, Right = 0,223606824874878
|
Co oznacza, ze w X nalezacym do przedzialu <Left, Right> i odpowiadajacym mu Y nalezacym do przedzialu <Left, Right> istnieja pary wartosci (x, y) dla ktorych wartosci zadanej funcji sa bliskie 0.
@armo Gdali przypuszczalnie chodzilo o to, ze wyznaczyles tylko jedne krance przedzialow.
Mam nadzieje ze to wam pomoze ;]
PS Jak sie okarze, ze to jest zle, to pamietajcie: "ja tu tylko sprzatam" ^^
Post został pochwalony 0 razy
|
|