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
Optymalizacja
Idź do strony Poprzedni  1, 2, 3, 4  Następny
 
Napisz nowy temat   Odpowiedz do tematu    Forum www.zinfa.fora.pl Strona Główna -> Rok IV / Opracowania, pomoce IV
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
nadroj




Dołączył: 23 Paź 2010
Posty: 14
Przeczytał: 0 tematów

Ostrzeżeń: 0/5

PostWysłany: Czw 12:50, 03 Mar 2011    Temat postu:

Moglby ktos wrzucic tresci zadan z ostatniego spotkania z Gdala

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




Dołączył: 14 Paź 2010
Posty: 40
Przeczytał: 0 tematów

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

PostWysłany: Czw 20:49, 03 Mar 2011    Temat postu:

nadroj napisał:
Moglby ktos wrzucic tresci zadan z ostatniego spotkania z Gdala


Zad 1: Znaleźć minimum funkcji, podam definicję jak miałem w kodzie
Kod:

    static double czarnaSkrzynka(double x[]){
        double w1 = Math.sqrt(x[0]*x[0]+(x[1]-1.0)*(x[1]-1)+x[2]*x[2])-1.0;
        double w2 = Math.abs(Math.sqrt((x[0]-0.5)*(x[0]-0.5)+(x[1]-0.5)*(x[1]-0.5)+(x[2]-0.5)*(x[2]-0.5))-0.25)-0.125;
        return Math.max(w1, w2);
    }


Zad 2: znaleźć miejsca zerowe funkcji
Kod:

    static double FczarnaSkrzynka(double x[]){
        double w1 = Math.sqrt(x[0]*x[0]+(x[1]-1.0)*(x[1]-1.0)+x[2]*x[2])-1.0;
        double w2 = Math.abs(Math.sqrt((x[0]-0.5)*(x[0]-0.5)+(x[1]-0.5)*(x[1]-0.5)+(x[2]-0.5)*(x[2]-0.5))-0.25)-0.125;
        return Math.abs(Math.max(w1, w2));
    }

tylko że w drugim zadaniu ważny był wektor i nie mam pewności jaki to był wektor chyba początek w [1,1,1] a przesunięcie [-1,-1,-1] (tak mi wychodzi z programu Gdali


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




Dołączył: 23 Paź 2010
Posty: 7
Przeczytał: 0 tematów

Ostrzeżeń: 0/5
Skąd: ostrow wlkp.

PostWysłany: Pią 18:35, 04 Mar 2011    Temat postu:

Czy ktoś pamięta jaki był 'satysfakcjonujący' wynik na zad 1.??

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




Dołączył: 14 Paź 2010
Posty: 40
Przeczytał: 0 tematów

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

PostWysłany: Pią 19:45, 04 Mar 2011    Temat postu:

Odpaliłem dzisiaj kod z kolokwium i mam
Kod:
-0.12499989119423277
czyli koło 1/8
powtórzyłem uruchomienie i wyszło ponownie okolica 1/8


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




Dołączył: 24 Wrz 2010
Posty: 74
Przeczytał: 0 tematów

Pomógł: 3 razy
Ostrzeżeń: 0/5

PostWysłany: Pią 20:45, 04 Mar 2011    Temat postu:

Kod:

Wartosc funkcji minimum przed ulepszaczem: -0.12499877
Wartosc funkcji w trakcie ulepszania: -0.12499877
Wartosc funkcji w trakcie ulepszania: -0.12499964
Wartosc funkcji minimum po ulepszaczu: -0.12499964
[0.30261254,0.53953433,0.35175896,,wynik:-0.12499964]

Mój wynik


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




Dołączył: 14 Paź 2010
Posty: 40
Przeczytał: 0 tematów

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

PostWysłany: Pią 23:58, 04 Mar 2011    Temat postu:

Udało mi się wreszcie zrobić Newtona wersję lepszą od Gdali
Dodałem grupowanie sąsiadujących wyników: jeśli wyniki "obok siebie" są "dobre" to wtedy łączy obszary i w rezultacie pokazuje środek połączonych obszarów.
Niestety mój algorytm porównywania i odrzucania kawałków musiałem poprawić bo mój algorytm odrzucał podobne wyniki
Zamiast
Kod:
if(Math.abs(czarnaSkrzynka(L))+Math.abs(czarnaSkrzynka(P))>P-L){

Zrobiłem
Kod:
if(Math.abs(czarnaSkrzynka(L))+Math.abs(czarnaSkrzynka(P))-EPSILON>P-L){

I wtedy poszło OK

Kod jest trochę zaśmiecony ale w/g mnie działa prawidłowo.
Kod:

/**
 *
 * @author my s370650 Artur Mańko
 */
public class NewtonZgrupowany {
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        //SprawdzObszar(0.0,1.0);
        wspolczynnik = 0.0 ;
        for(int i=0;i<przesuniecieWektora.length;i++)
            wspolczynnik += (przesuniecieWektora[i]*przesuniecieWektora[i]);
        wspolczynnik = Math.sqrt(wspolczynnik);
        SprawdzObszar(0.0,1.0*wspolczynnik);
        zakonczGrupowanie();
        System.out.println("Liczba miejsc zerowych: " + ileMiejscZerowych);
        System.out.println("Licznik sprawdzonych obszarow: "+ Licznik);
    }

    static int ileMiejscZerowych = 0;
    static double poczatekWektora[] = { 1.0, 1.0, 1.0 } ;
    static double przesuniecieWektora[] = { -1.0, -1.0, -1.0 } ;

    /*
    // Zadanie z cwiczeniach
    static double czarnaSkrzynka(double x){
        //return Math.abs(x-0.5)-1/(2*Math.sqrt(5));
        return FczarnaSkrzynka(0.1+3.0/5.0*x,0.1+4.0/5.0*x);
    }

    private static double FczarnaSkrzynka(double x1, double x2) {
        if(x1<0.5)
            return x2-0.25;
        else
            return Math.sqrt((x1-0.5)*(x1-0.5)+x2*x2)-0.25;
    }
     */


    static double wspolczynnik = Math.sqrt(3);

    // Kolkwium 1
    static double czarnaSkrzynka(double x){
        //return Math.abs(x-0.5)-1/(2*Math.sqrt(5));
        double xxx[] = new double[3];
        //xxx[0]=1.0-1.0*x/wspolczynnik;
        //xxx[1]=1.0-1.0*x/wspolczynnik;
        //xxx[2]=1.0-1.0*x/wspolczynnik;
        for(int i=0;i<przesuniecieWektora.length;i++)
            xxx[i]=poczatekWektora[i]+przesuniecieWektora[i]*x/wspolczynnik;
        return FczarnaSkrzynkaKolo1(xxx);
    }

    static double FczarnaSkrzynkaKolo1(double x[]){
        double w1 = Math.sqrt(x[0]*x[0]+(x[1]-1.0)*(x[1]-1.0)+x[2]*x[2])-1.0;
        double w2 = Math.abs(Math.sqrt((x[0]-0.5)*(x[0]-0.5)+(x[1]-0.5)*(x[1]-0.5)+(x[2]-0.5)*(x[2]-0.5))-0.25)-0.125;
        //return Math.abs(Math.max(w1, w2));
        return Math.max(w1, w2);
    }


    static final double EPSILON = 1e-12;
    //static final double EPSILON = Double.MIN_VALUE;
    static double dobrelL[];
    static double dobrelP[];
    static int ileDobrych;
    static int Licznik = 0;

    private static void SprawdzObszar(double L, double P) {
        //System.out.println(" >> Sprawdzam " + L + " " + P);
        Licznik++;
        if( Math.abs(L-P)<EPSILON ){
            if(Math.abs(czarnaSkrzynka(L))<EPSILON || Math.abs(czarnaSkrzynka(P))<EPSILON)
                //dodajDobryObszar(L,P);
                dodajIZgrupuj(L,P);
           }
        else
            if(Math.abs(czarnaSkrzynka(L))+Math.abs(czarnaSkrzynka(P))-EPSILON>P-L){
                //System.out.println(" -- Nie pasuje " + L + " " + P);
                //System.out.println(" --   czarnaSkrzynka(L) = " + czarnaSkrzynka(L) );
                //System.out.println(" --   czarnaSkrzynka(P) = " + czarnaSkrzynka(P) );
                //System.out.println(" --   c(L)+c(P)="+(Math.abs(czarnaSkrzynka(L))+Math.abs(czarnaSkrzynka(P)))+
                //        " P-L=" + (P-L));
                zakonczGrupowanie();
                return; // nie pasuje
            } else {
                SprawdzObszar(     L   , (P+L)/2  );
                SprawdzObszar( (P+L)/2 ,     P    );
            }
    }

    private static void dodajDobryObszar(double L, double P) {
        System.out.println("Znaleziony f(x):" + czarnaSkrzynka(L));
        //System.out.println("Znaleziony x:" + (0.1+3.0/5.0*L) + "," + (0.1+4.0/5.0*L));
        System.out.println("Znaleziony t:" + L);
        //System.out.println("Znaleziony x:" + P);
        //System.out.println("Znaleziony f(x):" + czarnaSkrzynka(P));
    }

    private static boolean grupowanie = false;
    private static double lewy;
    private static double prawy;
    private static int ileGrupowan = 0 ;

    private static void dodajIZgrupuj(double L, double P) {
        if(grupowanie){
            ileGrupowan++;
            //System.out.println("Grupowanie L="+L+" oldP="+prawy+" newP="+P);
            prawy = P;
        }else{
            grupowanie = true ;
            //System.out.println("Nowe grupowanie L="+L+" P="+P);
            lewy = L;
            prawy = P;
        }
    }

    private static void zakonczGrupowanie(){
        //System.out.println("zakonczGrupowanie");
        if(grupowanie){
            double srodek = (lewy+prawy)/2.0;
            //System.out.println("Znaleziony x:" + (0.1+3.0/5.0*srodek) + "," + (0.1+4.0/5.0*srodek));
            //System.out.println("Znaleziony x:" + (1.0-1.0*srodek/wspolczynnik) + "," + (1.0-1.0*srodek/wspolczynnik) + "," + (1.0-1.0*srodek/wspolczynnik));
            System.out.print("Znaleziony x: [");
            for(int i=0;i<przesuniecieWektora.length-1;i++)
                System.out.print(" " + (poczatekWektora[i]+przesuniecieWektora[i]*srodek/wspolczynnik) + ",");
            System.out.print(" " + (poczatekWektora[przesuniecieWektora.length-1]+przesuniecieWektora[przesuniecieWektora.length-1]*srodek/wspolczynnik));
            System.out.println(" ]");
            System.out.println("  x wektora="+srodek);
            //System.out.println("ileGrupowan="+ileGrupowan);
            grupowanie = false ;
            ileMiejscZerowych++;
        }
    }

}



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




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

Ostrzeżeń: 0/5

PostWysłany: Sob 10:40, 05 Mar 2011    Temat postu:

Macie rozwiązania to dawajcie

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




Dołączył: 14 Paź 2010
Posty: 40
Przeczytał: 0 tematów

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

PostWysłany: Sob 10:56, 05 Mar 2011    Temat postu:

zad 1 z dzisiaj

Kod:

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package kolo2_mc;

import java.util.Random;


/**
 *
 * @author s370650
 */
public class Kolo2_MC {

    static double czarnaSkrzynka(double x[]){
        double w1 = Math.sqrt(x[0]*x[0]+(x[1]*x[1]))-0.5;
        double w2 = Math.abs( Math.abs( x[0] - 0.5 ) - x[1] + 0.5 )- 0.25;
        return Math.min(w1, w2);
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        int maxIterations = 10000000;
        Random R = new Random();
        double x[] = new double[2];
        for(int i=0;i<x.length;i++)
            x[i]=R.nextDouble();
        double sMinimum = czarnaSkrzynka(x);
        double xMinimum[] = null;
        for(int i=maxIterations;i>0;i--){
            double nextX[] = new double[3];
            for(int j=0;j<x.length;j++)
                nextX[j]=R.nextDouble();

            double nextV = czarnaSkrzynka(nextX);
            if( nextV<sMinimum ){
                sMinimum = nextV;
                xMinimum = nextX.clone();
            }
            //sMinimum = (nextV<sMinimum) ? nextV : sMinimum;
        };
        System.out.println("Znalezione minimum = " + sMinimum);
        System.out.println("w punkcie = " + xMinimum[0] + "," + xMinimum[1]);


    }

}


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




Dołączył: 14 Paź 2010
Posty: 40
Przeczytał: 0 tematów

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

PostWysłany: Sob 10:58, 05 Mar 2011    Temat postu:

Zad 2
ale podobno mam sie zastanowic wiec to nie sa prawidlowe wyniki

Kod:

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package kolo2_newton;

/**
 *
 * @author s370650
 */
public class Newton {

    public static void main(String[] args) {
        // TODO code application logic here
        //SprawdzObszar(0.0,1.0);
        poczatekWektora = new double[]{0.0,0.0};
        przesuniecieWektora = new double[]{0.5,1.0};
        sprawdzWektor();
        przesuniecieWektora = new double[]{1.0,0.5};
        sprawdzWektor();

    }

    static void sprawdzWektor(){
        System.out.println("Sprawdzam wektor [" + przesuniecieWektora[0] + "," + przesuniecieWektora[1] + "]");
        wspolczynnik = 0.0 ;
        for(int i=0;i<przesuniecieWektora.length;i++)
            wspolczynnik += (przesuniecieWektora[i]*przesuniecieWektora[i]);
        wspolczynnik = Math.sqrt(wspolczynnik);
        SprawdzObszar(0.0,1.0*wspolczynnik);
        zakonczGrupowanie();
        System.out.println("Liczba miejsc zerowych: " + ileMiejscZerowych);
        System.out.println("Licznik sprawdzonych obszarow: "+ Licznik);
    }

    static int ileMiejscZerowych = 0;
    static double poczatekWektora[] = { 1.0, 1.0, 1.0 } ;
    static double przesuniecieWektora[] = { -1.0, -1.0, -1.0 } ;

    /*
    // Zadanie z cwiczeniach
    static double czarnaSkrzynka(double x){
        //return Math.abs(x-0.5)-1/(2*Math.sqrt(5));
        return FczarnaSkrzynka(0.1+3.0/5.0*x,0.1+4.0/5.0*x);
    }

    private static double FczarnaSkrzynka(double x1, double x2) {
        if(x1<0.5)
            return x2-0.25;
        else
            return Math.sqrt((x1-0.5)*(x1-0.5)+x2*x2)-0.25;
    }
     */


    static double wspolczynnik = Math.sqrt(3);

    // Kolkwium 1
    static double czarnaSkrzynka(double x){
        //return Math.abs(x-0.5)-1/(2*Math.sqrt(5));
        double xxx[] = new double[2];
        //xxx[0]=1.0-1.0*x/wspolczynnik;
        //xxx[1]=1.0-1.0*x/wspolczynnik;
        //xxx[2]=1.0-1.0*x/wspolczynnik;
        for(int i=0;i<przesuniecieWektora.length;i++)
            xxx[i]=poczatekWektora[i]+przesuniecieWektora[i]*x/wspolczynnik;
        return FczarnaSkrzynkaKolo2(xxx);
    }

    static double FczarnaSkrzynkaKolo2(double x[]){
        double w1 = Math.sqrt(x[0]*x[0]+(x[1]*x[1]))-0.5;
        double w2 = Math.abs( Math.abs( x[0] - 0.5 ) - x[1] + 0.5 )- 0.25;
        return Math.min(w1, w2);
    }


    static double FczarnaSkrzynkaKolo1(double x[]){
        double w1 = Math.sqrt(x[0]*x[0]+(x[1]-1.0)*(x[1]-1.0)+x[2]*x[2])-1.0;
        double w2 = Math.abs(Math.sqrt((x[0]-0.5)*(x[0]-0.5)+(x[1]-0.5)*(x[1]-0.5)+(x[2]-0.5)*(x[2]-0.5))-0.25)-0.125;
        //return Math.abs(Math.max(w1, w2));
        return Math.max(w1, w2);
    }


    static final double EPSILON = 1e-12;
    //static final double EPSILON = Double.MIN_VALUE;
    static double dobrelL[];
    static double dobrelP[];
    static int ileDobrych;
    static int Licznik = 0;

    private static void SprawdzObszar(double L, double P) {
        //System.out.println(" >> Sprawdzam " + L + " " + P);
        Licznik++;
        if( Math.abs(L-P)<EPSILON ){
            if(Math.abs(czarnaSkrzynka(L))<EPSILON || Math.abs(czarnaSkrzynka(P))<EPSILON)
                //dodajDobryObszar(L,P);
                dodajIZgrupuj(L,P);
           }
        else
            if(Math.abs(czarnaSkrzynka(L))+Math.abs(czarnaSkrzynka(P))-EPSILON>P-L){
                //System.out.println(" -- Nie pasuje " + L + " " + P);
                //System.out.println(" --   czarnaSkrzynka(L) = " + czarnaSkrzynka(L) );
                //System.out.println(" --   czarnaSkrzynka(P) = " + czarnaSkrzynka(P) );
                //System.out.println(" --   c(L)+c(P)="+(Math.abs(czarnaSkrzynka(L))+Math.abs(czarnaSkrzynka(P)))+
                //        " P-L=" + (P-L));
                zakonczGrupowanie();
                return; // nie pasuje
            } else {
                SprawdzObszar(     L   , (P+L)/2  );
                SprawdzObszar( (P+L)/2 ,     P    );
            }
    }

    private static void dodajDobryObszar(double L, double P) {
        System.out.println("Znaleziony f(x):" + czarnaSkrzynka(L));
        //System.out.println("Znaleziony x:" + (0.1+3.0/5.0*L) + "," + (0.1+4.0/5.0*L));
        System.out.println("Znaleziony t:" + L);
        //System.out.println("Znaleziony x:" + P);
        //System.out.println("Znaleziony f(x):" + czarnaSkrzynka(P));
    }

    private static boolean grupowanie = false;
    private static double lewy;
    private static double prawy;
    private static int ileGrupowan = 0 ;

    private static void dodajIZgrupuj(double L, double P) {
        if(grupowanie){
            ileGrupowan++;
            //System.out.println("Grupowanie L="+L+" oldP="+prawy+" newP="+P);
            prawy = P;
        }else{
            grupowanie = true ;
            //System.out.println("Nowe grupowanie L="+L+" P="+P);
            lewy = L;
            prawy = P;
        }
    }

    private static void zakonczGrupowanie(){
        //System.out.println("zakonczGrupowanie");
        if(grupowanie){
            double srodek = (lewy+prawy)/2.0;
            //System.out.println("Znaleziony x:" + (0.1+3.0/5.0*srodek) + "," + (0.1+4.0/5.0*srodek));
            //System.out.println("Znaleziony x:" + (1.0-1.0*srodek/wspolczynnik) + "," + (1.0-1.0*srodek/wspolczynnik) + "," + (1.0-1.0*srodek/wspolczynnik));
            System.out.print("Znaleziony x: [");
            for(int i=0;i<przesuniecieWektora.length-1;i++)
                System.out.print(" " + (poczatekWektora[i]+przesuniecieWektora[i]*srodek/wspolczynnik) + ",");
            System.out.print(" " + (poczatekWektora[przesuniecieWektora.length-1]+przesuniecieWektora[przesuniecieWektora.length-1]*srodek/wspolczynnik));
            System.out.println(" ]");
            System.out.println("  x wektora="+srodek);
            //System.out.println("ileGrupowan="+ileGrupowan);
            grupowanie = false ;
            ileMiejscZerowych++;
        }
    }

}



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




Dołączył: 23 Paź 2010
Posty: 9
Przeczytał: 0 tematów

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

PostWysłany: Wto 11:12, 08 Mar 2011    Temat postu:

Czy ktoś pamięta jakie były ostateczne wyniki dla 2 zadania z 2 koła bo ja otrzymuję prawie te same co Artur. Moje prawie polega na tym że Artur uzyskał 3 wyniki ja 4.

Dla wektora [0.5 1] są to
x=0.22360679774994 y=0.447213595499989
x=0.25000000000114 y=0.500000000000227

Dla wektora [1 0.5] są to
x=0.447213595499989 y=0.22360679774994
y=0.250000000000114 y=0.50000000000227

punkty obliczane są za pomocą metody newtona a następnie zamiast wyświetlać przedział odpowiednio wyświetlam

poczatekWektora[0]+przesuniecieWektora[0]*srodek/sqrt(1.25)
poczatekWektora[1]+przesuniecieWektora[1]*srodek/sqrt(1.25)

Najpierw dla jednego wektora a później dla drugiego.
Wszystko dla zakresu od (0, sqrt(1.25))

Jakieś pomysły ?? co może być nie tak bo już wypadałoby to zaliczyć Confused


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




Dołączył: 23 Paź 2010
Posty: 14
Przeczytał: 0 tematów

Ostrzeżeń: 0/5

PostWysłany: Wto 14:45, 08 Mar 2011    Temat postu:

@SzymonM Napisz co powiedzial ci Gdala jak pokazales mu te wyniki i wrzuc kod swojej aplikacji to moze cos uda sie ustalic ;]

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




Dołączył: 23 Paź 2010
Posty: 9
Przeczytał: 0 tematów

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

PostWysłany: Wto 15:25, 08 Mar 2011    Temat postu:

Gdala tych wyników akurat nie widział bo miałem błąd w obliczaniu wektora o czym skapnąłem się dopiero w domu przeglądając kod. A sam kod to ten który umieścił Gdala z ostatniego zaliczenia z tym że wypisywanie przedziałów zastąpiłem wypisaniem:

poczatekWektora[0]+przesuniecieWektora[0]*srodek/sqrt(1.25)
poczatekWektora[1]+przesuniecieWektora[1]*srodek/sqrt(1.25)

i cały program uruchamiam jakby 2 razy raz dla jednego wektora a później dla drugiego.


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




Dołączył: 23 Paź 2010
Posty: 14
Przeczytał: 0 tematów

Ostrzeżeń: 0/5

PostWysł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
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: Wto 17:12, 08 Mar 2011    Temat postu:

tak z ciekawości, czy ktoś poza Tomkiem i Arturem zdał?

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




Dołączył: 24 Wrz 2010
Posty: 74
Przeczytał: 0 tematów

Pomógł: 3 razy
Ostrzeżeń: 0/5

PostWysłany: Śro 9:54, 09 Mar 2011    Temat postu:

Kod:

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));
}


Skąd Ci się wzięło
Kod:
 x = 0.5 * t / Math.sqrt(1.25);
skoro wzór na wyliczenie punktów jest
Kod:
 x = p + n * t
?

Post został pochwalony 0 razy

Ostatnio zmieniony przez Rind dnia Czw 12:20, 10 Mar 2011, w całości zmieniany 1 raz
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 / Opracowania, pomoce IV Wszystkie czasy w strefie CET (Europa)
Idź do strony Poprzedni  1, 2, 3, 4  Następny
Strona 3 z 4

 
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