Marek
Dołączył: 13 Kwi 2010 Posty: 3
Przeczytał: 0 tematów
Ostrzeżeń: 0/5
|
Wysłany: Nie 16:01, 16 Paź 2011 Temat postu: |
|
|
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Metoda_Newtona
{
class MetodaNewtona
{
static int licznik = 0;
static double EPSILON = 0.005;
public static void Main(String[] args)
{
SprawdzObszar(0.0, 10.0);
}
static double bb(double t)
{
/*
zamiana z 3 na 1 zmienna:
początek(p) w 0,0,8, koniec(k) 1,1,0
(pamiętając, że x1=p1+k1*t)
x1=0+t*1 -> x1=t
x2=0+t*1 -> x2=t
x3=8+t*0 -> x3=8
*/
// return f(0.0 + 1.0*t,0.0+1.0*t,8.0+0.0);
double x = t;
double y = t;
double z = 8 + t * 0;
return f(x, y, z);
}
public static double f(double a, double b, double c)
{
double odp = Math.Abs(Math.Sqrt(
Math.Pow((a - 5.0), 0) + Math.Pow((b - 5.0), 0) + Math.Pow((c - 5.0), 0)
) - 3.0)
+ Math.Abs(c - 8.0) - 0.0625;
return Math.Abs(odp);
}
private static void SprawdzObszar(double L, double P)
{
licznik++;
if (Math.Abs(L - P) < EPSILON)
{
if (Math.Abs(bb(L)) < EPSILON || Math.Abs(bb(P)) < EPSILON)
// filtrowanie powtarzających się przedziałów
if (Math.Abs(bb(L)) < 0.001)
{
WypiszDobryObszar(L, P);
}
}
else
{
if (Math.Abs(bb(L)) + Math.Abs(bb(P)) > P - L)
{
// System.out.println("pusto");
return; // nie pasuje
}
else
{
//System.out.println("dzielimy dalej");
SprawdzObszar(L, (P + L) / 2.0);
SprawdzObszar((P + L) / 2.0, P);
}
}
}
private static void WypiszDobryObszar(double L, double P)
{
Console.WriteLine("Potrzeba " + licznik + " wartości funkcji");
Console.WriteLine("\nZnaleziono f(x):" + bb(L));
Console.WriteLine("\nx:" + L + "\ny:" + L + "\nz:" + 8.0);
Console.WriteLine("\nZnaleziony t:" + L + "\n");
Console.ReadKey();
}
}
}
Post został pochwalony 0 razy
|
|