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
 
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ść
Rind




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

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

PostWysłany: Śro 10:00, 09 Mar 2011    Temat postu:

Kod:

rind@vz-178-217-184-165:~/ruby$ ruby kolo2.rb
wektor [0.5, 1]
left = 0.499999999999994, right: 0.500000000000002
x: 0.447213595499953, y: 0.223606797749976
wektor [1, 0.5]
left = 0.499999999999994, right: 0.500000000000002
x: 0.447213595499953, y: 0.223606797749976
left = 0.559016994374947, right: 0.559016994374955
x: 0.5, y: 0.25


Ja mam takie wyniki


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: Czw 12:19, 10 Mar 2011    Temat postu:

Jeszcze raz.

Czy KTOKOLWIEK wie SKĄD się bierze
Kod:
x = p + n * t
?

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: Czw 16:22, 10 Mar 2011    Temat postu:

@Rind
Kod:

x = p + n * t


To jest równanie paramteryczne prostej (wiecej [link widoczny dla zalogowanych])

Dla zadania z ostatniej zalki proste przechodzily przez punkt (0,0) i byly rownolegle do wektorow [1 0.5] i [0.5 1] (zapis powinien byc w pionie).

Po podstawieniu pod wzor otrzymujesz nastepujace rownania dla pierwszej prostej:
Kod:

x1 = 0 + 1*t
x2 = 0 + 0.5*t


...i dla drugiej prostej:
Kod:

x1 = 0 + 0.5*t
x2 = 0 + 1*t


Post został pochwalony 0 razy

Ostatnio zmieniony przez nadroj dnia Czw 16:25, 10 Mar 2011, w całości zmieniany 1 raz
Powrót do góry
Zobacz profil autora
Autor Wiadomość
mario445




Dołączył: 18 Gru 2007
Posty: 57
Przeczytał: 0 tematów

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

PostWysł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
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: Pią 10:44, 11 Mar 2011    Temat postu:

@mario445 Nie smiga dlatego, ze nie uruchamia ci sie konstruktor klasy, czyli nie masz ustawionej zmiennej epsM.

Zamien to:
Kod:

   static void Fcj(){

      double a = 1;
      double b = 1;
      while (a + b != 1)
         b *= 0.5;
      epsM = b * 2.0;
   }

...na to:
Kod:

   static{

      double a = 1;
      double b = 1;
      while (a + b != 1)
         b *= 0.5;
      epsM = b * 2.0;
   }


...i bedzie smigac ;]


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




Dołączył: 18 Gru 2007
Posty: 57
Przeczytał: 0 tematów

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

PostWysłany: Pią 20:08, 11 Mar 2011    Temat postu:

dzięki

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: Sob 18:09, 12 Mar 2011    Temat postu:

zad z dziś
Kod:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static double epsM;

        static Program()
        {

            double a = 1;
            double b = 1;
            while (a + b != 1)
            {

                b *= 0.5;
            }
            epsM = b * 2.0;
        }

        private static double epsilon = 0.000000001;
        private static bool check = false;

        private static int count = 0;
        public static double g(double x1, double x2, double x3)
        {
            count++;
            //return Math.Max(Math.Sqrt(x1*x1+(x2-1)*(x2-1))-1,Math.Abs(Math.Sqrt((x1-0.5)*(x1-0.5)+(x2-0.5)*(x2-0.5)+(x3-0.5)*(x3-0.5))-0.25)-0.125);
            //return Math.Min(Math.Sqrt(x1 * x1 + x2 * x2) - 0.5,
            //    Math.Abs(Math.Abs(x1 - 0.5) - x2 + 0.5) - 0.25);
            //return Math.Min(Math.Sqrt(x1 * x1 + x2 * x2) - 0.5, Math.Abs(Math.Abs(x1 - 0.5) - x2 + 0.5) - 0.25);
            return Math.Abs(Math.Abs(Math.Sqrt(((x1 - 0.5) * (x1 - 0.5)) + ((x2 - 0.5) * (x2 - 0.5)) +
                ((x3 - 0.5) * (x3 - 0.5))) - 0.25) - 0.0625) - 0.1;
        }

        public static double Blackbox(double x)
        {
            //double t0, t1;
            /*if (check)
            {
                t0 = x / Math.Sqrt(5);
                t1 = 2.0 * x / Math.Sqrt(5);
            }
            else
            {
                t0 = 2.0 * x / Math.Sqrt(5);
                t1 = x / Math.Sqrt(5);
            }*/
            //double t0 = 0.5 - x / Math.Sqrt(5.0) * 2.0;
            //double t1 = 1.0 - x / Math.Sqrt(5.0) * 2.0;

            //double t = 1.0 - x / Math.Sqrt(3);

            return Math.Abs(g(0.5, 0.5, x));
        }

        private static void Function(double i, double e, double vi, double ve)
        {
            double left = vi;
            double right = ve;
            double res = e - i;
            if (res <= epsilon && left < epsilon && right < epsilon)
            {
                Console.WriteLine(" Left = " + i + ", Right = " + e);
                //Console.WriteLine("X: Left = " + i + ", Right = " + e );
                //Console.WriteLine("Y: Left = " + i + ", Right = " + e);
                //Console.WriteLine("Z: Left = " + i + ", Right = " + e);
            }
            else
            {
                double c = (e + i) * 0.5;
                double center = Blackbox(c);
                res = res * 0.5 - center + epsM;

                if (left <= res) Function(i, c, left, center);
                if (right <= res) Function(c, e, center, right);

            }
        }

        static void Main(string[] args)
        {
            double i = 0;
            double e = 1;
            check = false;
            Function(i, e, Blackbox(i), Blackbox(e));
            //check = true;
            //Console.WriteLine("-----------------");
            //Function(i, e, Blackbox(i), Blackbox(e));
            //Console.WriteLine(count);
            //double t = 0.9;
            //Console.WriteLine(Math.Abs(Math.Abs(Math.Abs(Math.Abs(t - 0.5)-0.25)-0.625)-0.1));
            Console.ReadLine();
        }
    }
}


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 / Opracowania, pomoce IV Wszystkie czasy w strefie CET (Europa)
Idź do strony Poprzedni  1, 2, 3, 4
Strona 4 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