Forum www.zinfa.fora.pl Strona Główna
FAQ Szukaj Użytkownicy Grupy Profil Zaloguj się, by sprawdzić wiadomości
Forum www.zinfa.fora.pl Strona Główna  Zaloguj  Rejestracja
Gdala party V
Idź do strony Poprzedni  1, 2
 
Napisz nowy temat   Odpowiedz do tematu    Forum www.zinfa.fora.pl Strona Główna -> Rok IV / Terminy, wydarzenia IV
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
inatheith




Dołączył: 15 Maj 2011
Posty: 7
Przeczytał: 0 tematów

Ostrzeżeń: 0/5
Skąd: Wschowa

PostWysłany: Nie 1:10, 05 Cze 2011    Temat postu: zad.2.

Drugie zadanie to kod z forum (duże piwko dla Artura:) ).
Wystarczyło go zrozumieć i dostosować w dwóch miejscach:
1. przedział zmienić na 0.0 do 10.0
Kod:
SprawdzObszar(0.0,10.0);

2. z wyrzucanych wyników jakoś odfiltrować powtarzające się przedziały. Z obserwacji wynikało, że to są okolice dwóch wartości t, więc po prostu dodałem if'a, można było drugi epsilon, który filtrował najbliższe wyniki, tak,że zostały dwa najlepsze;)
Kod:
if (Math.abs(bb(L))<0.001) {WypiszDobryObszar(L,P);


i leciało to tak:
Kod:

package newton2;

public class Main {

    public static void main(String[] args) {
        SprawdzObszar(0.0,10.0);
    }

        static double bb(double t){
       // return f(0.0 + 1.0*t,0.0+1.0*t,8.0+0.0);
            return f(t,t,8.0);
    }

     public static double f(double a, double b, double c){
        double odp=Math.abs(Math.sqrt(
                Math.pow((a-5.0),2)+Math.pow((b-5.0),2)+Math.pow((c-5.0),2)
                )-3.0)
                +Math.abs(c-8.0)-0.0625;

        return Math.abs(odp);
       
    }

    static final double EPSILON = 0.005;

    private static void SprawdzObszar(double L, double P) {
        if( Math.abs(L-P)<EPSILON ){
            if(Math.abs(bb(L))<EPSILON || Math.abs(bb(P))<EPSILON)
                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) {
        System.out.print("\nZnaleziono f(x):" + bb(L));
        System.out.print("\nx:" +L+ "\ny:" + L+"\nz:"+8.0);
        System.out.print("\nZnaleziony t:" + L+"\n");
    }

}


kilka słów o magicznej zamianie 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
stąd
Kod:

static double bb(double t){
            return f(t,t,8.0);
}


Post został pochwalony 0 razy
Powrót do góry
Zobacz profil autora
Autor Wiadomość
zbychup




Dołączył: 17 Paź 2010
Posty: 130
Przeczytał: 0 tematów

Pomógł: 1 raz
Ostrzeżeń: 0/5

PostWysłany: Pon 12:23, 06 Cze 2011    Temat postu:

ok, jeśli chodzi o zadanko pierwsze to udało mi się poprawić kod tak by dało pierwsze trzy znaki po przecinku satysfakcjonujące:
Kod:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace MinFun
{
    class Program
    {
        public static double min(double x, double y, double z)
        {
            return Math.Abs(Math.Sqrt((x - 5) * (x - 5) + (y - 5) * (y - 5) + (z - 5) * (z - 5)) - 3) + Math.Abs(z - 8) - 0.0625;

        }

        static void Main(string[] args)
        {

            double[] tab = new double[3];
            double[] pkt = new double[3];


            Random r = new Random();

            for (int k = 0; k < 1; k++)
            {
                tab[0] = r.NextDouble()*10;
                tab[1] = r.NextDouble()*10;
                tab[2] = r.NextDouble()*10;

                double tmpMin = Program.min(tab[0], tab[1], tab[2]);
                for (int i = 0; i < 1000000000; i++)
                {
                    double tmp = 0;
                    tab[0] = r.NextDouble()*10;
                    tab[1] = r.NextDouble()*10;
                    tab[2] = r.NextDouble()*10;
                    tmp = Program.min(tab[0], tab[1], tab[2]);
                    if (tmpMin > tmp)
                    {
                        tmpMin = tmp;
                        pkt = tab;
                    }
                }
                String.Format("{0:0.000000}", tmpMin);
                System.Console.WriteLine("Min Fun:" + String.Format("{0:0.000000}", tmpMin) + " pkt: {0} , {1}, {2}", String.Format("{0:0.000000}", tab[0]), String.Format("{0:0.000000}", tab[1]), String.Format("{0:0.000000}", tab[2]));
            }
            System.Console.ReadKey();

        }
    }
}


CO DAJE WYNIK (po kilkudziesięciu sekundach niestety przy moim procku:
Min Fun:-0,062311 pkt: 8,065927 , 0,680772, 3,459846

Czyli wystarczyło poprawić zakres próbkowania z domyślnego na 0-10 mnożąc x 10. zwiększyłem też liczbę iteracji pętli próbkującej do 1000000000 bo nie otrzymywałem precyzyjnych wyników.

Pozdro i powodzenia na Gdala part VI!!!!


Post został pochwalony 0 razy

Ostatnio zmieniony przez zbychup dnia Pon 15:58, 06 Cze 2011, w całości zmieniany 1 raz
Powrót do góry
Zobacz profil autora
Autor Wiadomość
inatheith




Dołączył: 15 Maj 2011
Posty: 7
Przeczytał: 0 tematów

Ostrzeżeń: 0/5
Skąd: Wschowa

PostWysłany: Pon 12:41, 06 Cze 2011    Temat postu:

No widzisz, stosując poprawianie wg. mojego wcześniejszego przepisu mamy ok. 4.200.000 operacji głównych.
Oczywiście nie licze operacji w funkcji poprawiającej.
..i otrzymujemy lepszy wynik -0.062499..., bo tylko o ok. 0.00001 oddalony od prawidłowego.

Te zadanie było ewidentnie pod poprawianie. Nawet sam Gdala o tym komuś wspomniał.


Post został pochwalony 0 razy
Powrót do góry
Zobacz profil autora
Autor Wiadomość
zbychup




Dołączył: 17 Paź 2010
Posty: 130
Przeczytał: 0 tematów

Pomógł: 1 raz
Ostrzeżeń: 0/5

PostWysłany: Pon 15:03, 06 Cze 2011    Temat postu:

no tak ale mówił też że za metodę z ulepszeniami da 4.0, a na 3 wystarczy poprawny wynik z dokładnością do 3 znaków po przecinku.

Post został pochwalony 0 razy
Powrót do góry
Zobacz profil autora
Autor Wiadomość
Garth




Dołączył: 25 Lis 2007
Posty: 46
Przeczytał: 0 tematów

Pomógł: 2 razy
Ostrzeżeń: 0/5
Skąd: Poznań

PostWysłany: Pią 20:52, 10 Cze 2011    Temat postu:

To on wam teraz oceny wstawiał? ....

Post został pochwalony 0 razy
Powrót do góry
Zobacz profil autora
Autor Wiadomość
emil_seba




Dołączył: 22 Lis 2007
Posty: 109
Przeczytał: 0 tematów

Pomógł: 1 raz
Ostrzeżeń: 0/5

PostWysłany: Sob 12:46, 11 Cze 2011    Temat postu:

jak wyzej tylko ze C#
Kod:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace MonteCarloTurbo
{
    class Program
    {
        static Random r = new Random();
        public static double black_box(int n, double[] tab)
        {
            double odp = Math.Abs(Math.Sqrt(
                    Math.Pow((tab[1] - 5.0), 2) + Math.Pow((tab[2] - 5.0), 2) + Math.Pow((tab[3] - 5.0), 2)
                    ) - 3.0)
                    + Math.Abs(tab[3] - 8.0) - 0.0625;

            return odp;
        }
        public static double[] fiat_monte_carlo(int n, int testy, double[] x1)
        {
            double[] x = new double[10];
            double[] xM = new double[10];
            //usyawiam jakieĹ› mini
            xM = (double[])x1.Clone();
            //   Array.Copy(x1, xM, x1.Length);




            //szukamy punktu o najmniejej wartoĹ›ci funkcji blax_box
            for (int j = 1; j <= testy; j++)
            {
                //losujemy punkt

                for (int i = 1; i <= n; i++)
                {
                    x[i] = r.NextDouble() * 10.0;
                    //x[i]=5.0+Math.random()*3.0;
                }
                //sprawdzamy czy jest to minimum
                if (black_box(n, x) < black_box(n, xM))
                {
                    xM = (double[])x.Clone();
                    //Array.Copy(x, xM, x.Length);
                    //xM=x;
                    //System.out.print("mam mniejszy\n");
                }
            }
            //obecnie mamy w tablicy xM najmniejsza wartosc   
            return xM;
        }

        public static double kroczek(double wartosc, double krok)
        {
            double k;
            k = wartosc + krok;
            if ((k) > 10.0)
            {
                k = 10.0;
            }
            if ((k) < 0.0)
            {
                k = 0.0;
            }
            return k;
        }

        public static double[] popraw(double[] x, int n, double krok)
        {

            double[] xM = new double[10];
            double[] tmp1 = new double[10];
            double[] tmp2 = new double[10];
            //xM=x;
            //Array.Copy(x,xM,x.Length);
            xM = (double[])x.Clone();
            //  szukamy punktu o najmniejej wartoĹ›ci funkcji blax_box
            for (int j = 1; j <= n; j++)
            {
                //   poruszamy siÄ™ po osiach
                //tmp1=xM;
                tmp1 = (double[])xM.Clone();
                // Array.Copy(xM, tmp1, xM.Length);
                //tmp2=xM;
                //  Array.Copy(xM,tmp2,xM.Length);
                tmp2 = (double[])xM.Clone();
                tmp1[j] = kroczek(tmp1[j], krok);
                tmp2[j] = kroczek(tmp2[j], -krok);
                //sprawdzamy, ktĂłra wartość jest najmniejsza oryginalna(ew. poprawiona na innej osi)
                // lewa, czy prawa
                if (black_box(n, tmp1) < black_box(n, xM))
                {
                    //xM=tmp1;
                    //Array.Copy(tmp1, xM, tmp1.Length);
                    xM = (double[])tmp1.Clone();


                }
                if (black_box(n, tmp2) < black_box(n, xM))
                {
                    //    xM=tmp2;
                    //Array.Copy(tmp2, xM, tmp2.Length);
                    xM = (double[])tmp2.Clone();

                }
            }
            //obecnie mamy w tablicy xM najmniejsza wartosc   
            return xM;
        }


        static void Main(string[] args)
        {////dane parametryzujace
            int wymiar = 3;
            int proby = 1000;
            double[] x = new double[4];
            int ilosc_poprawek = 20000;
            double epsilon = 0.0000002;


            for (int i = 1; i <= wymiar; i++)
            {
                x[i] = r.NextDouble() * 10.0;
            }

            // x[1]=5.0;
            //x[2]=5.0;
            // x[3]=8.0;


            for (int j = 1; j < 200; j++)
            {

                // x=fiat_monte_carlo(wymiar,proby,x);
                //Array.Copy(fiat_monte_carlo(wymiar, proby, x), x, fiat_monte_carlo(wymiar, proby, x).Length);
                x = (double[])fiat_monte_carlo(wymiar, proby, x).Clone();
                for (int i = 1; i <= ilosc_poprawek; i++)
                {
                    //Array.Copy(popraw(x, wymiar, epsilon), x, popraw(x, wymiar, epsilon).Length);
                    x = (double[])popraw(x, wymiar, epsilon).Clone();

                    //x = popraw(x, wymiar, epsilon);
                }
            }

            String odp;
            odp = "Punkt minumum black_box:\nx =(\n";
            for (int j = 1; j <= wymiar; j++)
            {
                odp = odp + x[j] + "\n";
            }
            odp = odp + ");\n";
            odp = odp + "f=" + black_box(wymiar, x);
            Console.WriteLine(odp);
            Console.ReadKey();
        }

    }
}



Post został pochwalony 0 razy
Powrót do góry
Zobacz profil autora
Autor Wiadomość
emil_seba




Dołączył: 22 Lis 2007
Posty: 109
Przeczytał: 0 tematów

Pomógł: 1 raz
Ostrzeżeń: 0/5

PostWysłany: Sob 13:45, 11 Cze 2011    Temat postu:

zad 2 przerobione na c#

Kod:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace opt
{
    class Program
    {

        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){
       // 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),2)+Math.Pow((b-5.0),2)+Math.Pow((c-5.0),2)
                )-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)
                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+" wart funckji");
        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
Powrót do góry
Zobacz profil autora
Autor Wiadomość
zbychup




Dołączył: 17 Paź 2010
Posty: 130
Przeczytał: 0 tematów

Pomógł: 1 raz
Ostrzeżeń: 0/5

PostWysłany: Pią 15:33, 17 Cze 2011    Temat postu:

czyli jutro 15:30, czy sie cos zmienilo?

Post został pochwalony 0 razy
Powrót do góry
Zobacz profil autora
Autor Wiadomość
emil_seba




Dołączył: 22 Lis 2007
Posty: 109
Przeczytał: 0 tematów

Pomógł: 1 raz
Ostrzeżeń: 0/5

PostWysłany: Pią 18:36, 17 Cze 2011    Temat postu:

hej, dostalem informacje od Gdali ze "narazie zapowiada sie ze jutro poprawy nie bedzie", jak beda jakies zmiany dam znac

Post został pochwalony 0 razy
Powrót do góry
Zobacz profil autora
Autor Wiadomość
zbychup




Dołączył: 17 Paź 2010
Posty: 130
Przeczytał: 0 tematów

Pomógł: 1 raz
Ostrzeżeń: 0/5

PostWysłany: Pon 11:39, 20 Cze 2011    Temat postu:

coś wiadomo o terminie zaliczenia?

Post został pochwalony 0 razy
Powrót do góry
Zobacz profil autora
Autor Wiadomość
emil_seba




Dołączył: 22 Lis 2007
Posty: 109
Przeczytał: 0 tematów

Pomógł: 1 raz
Ostrzeżeń: 0/5

PostWysłany: Pon 22:27, 20 Cze 2011    Temat postu:

hej, na ten czas nic nie wiem

Post został pochwalony 0 razy
Powrót do góry
Zobacz profil autora
Wyświetl posty z ostatnich:   
Napisz nowy temat   Odpowiedz do tematu    Forum www.zinfa.fora.pl Strona Główna -> Rok IV / Terminy, wydarzenia IV Wszystkie czasy w strefie CET (Europa)
Idź do strony Poprzedni  1, 2
Strona 2 z 2

 
Skocz do:  
Nie możesz pisać nowych tematów
Nie możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
fora.pl - załóż własne forum dyskusyjne za darmo
Powered by phpBB © 2001, 2002 phpBB Group
BBTech Template by © 2003-04 MDesign
Regulamin