Mathescript

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Mathescript

    hi, ich habe ein mathescript enwickelt, das mir den schnittpunkt von 2 linearen gleichungen errechnen soll.
    das funktioniert ganz gut, solange ich nur die werte bei 1, 2, 3, ... (also den x werten ohne komma) abfrage. aber viele schnittpunkte liegen auf der komma stelle und desshalb wollte ich die einbauen. ich hab die erhöhung einfach überall durch 10 gerechnet, aber dann ging das script nicht mehr, bei einer überprüfung, die ich schon wieder aus dem script entfernt habe, hat mir das programm gesagt: 4 = 4 und 8 != 8. wie kann das passieren, is mein script vielleicht irgendwo falsch??
    PHP-Code:
    <body>
    Beta-Linearegleichung<br>
    <form action="matheneu.php" method="POST"> 
    X<input type="text" size="2" maxlenght="2" name="x1"><br> 
    Y<input type="text" size="2" maxlenght="2" name="y1"><br>
    Steigung<input type="text" size="2" maxlenght="2" name="s1"><br>    <br> 
    X<input type="text" size="2" maxlenght="2" name="x2"><br> 
    Y<input type="text" size="2" maxlenght="2" name="y2"><br>    
    Steigung<input type="text" size="2" maxlenght="2" name="s2"><br>    
    <input type="submit" name="rechnen" value="errechnen">
    </form> 
    <?php
    if(isset($rechnen)) { 
    $id=1;    
    $mid=1;    
    if(
    $x1!=0) {    
    $y1=$y1-($x1*$s1);    
    $x1=0;    
    }    
    if(
    $x2!=0) {    
    $y2=$y2-($x2*$s2);    
    $x2=0;    
    }    
    if(
    $x1==$x and $y1==$y2) {    
    echo 
    "Schnittpunkt: $x1/$y1 und $x2/$y2<br>";    
    $status='fertig';    
    }    
    $e1x=$x1;    
    $e1y=$y1;    
    $e2x=$x2;    
    $e2y=$y2;    
    while(
    $id<=1000 and $status!='fertig') {    
    $e1x=$e1x+1/10;    
    $e1y=$e1y+($s1/10);    
    $e2x=$e2x+1/10;    
    $e2y=$e2y+($s2/10);    
    #rechnung beendet    
    if($e1x==$e2x and $e1y==$e2y) {    
    echo 
    "Schnittpunkt: $e1x $e1y";    
    $status='fertig';    
    $stat='fertig';    
    }    
    $id++;    
    }    
    if(
    $stat!='fertig') {    
    echo 
    "Kein Schnittpunkt gefunden.";    
    }    
    }    
    ?>    
    </body>
    das script kann manhier angucken.

    ich hoffe, ihr könnt mir helfen.

    mfg Flash

  • #2
    hier erst mal bessere formatierung:
    PHP-Code:
    <?php
    if(isset($rechnen)) 

        
    $id=1;    
        
    $mid=1;    
        if(
    $x1!=0
        {    
            
    $y1=$y1-($x1*$s1);    
            
    $x1=0;    
        }    
        if(
    $x2!=0
        {    
            
    $y2=$y2-($x2*$s2);    
            
    $x2=0;    
        }    
        
        if(
    $x1==$x and $y1==$y2
        {    
            echo 
    "Schnittpunkt: $x1/$y1 und $x2/$y2<br>";    
            
    $status='fertig';    
        }    
        
        
    $e1x=$x1;    
        
    $e1y=$y1;    
        
    $e2x=$x2;    
        
    $e2y=$y2;    
        
        while(
    $id<=1000 and $status!='fertig'
        {    
            
    $e1x=$e1x+1/10;    
            
    $e1y=$e1y+($s1/10);    
            
    $e2x=$e2x+1/10;    
            
    $e2y=$e2y+($s2/10);    

            
    #rechnung beendet    
            
    if($e1x==$e2x and $e1y==$e2y
            {    
                echo 
    "Schnittpunkt: $e1x $e1y";    
                
    $status='fertig';    
                
    $stat='fertig';    
            }    
            
            
    $id++;    
        }    
        
        if(
    $stat!='fertig'
        {    
            echo 
    "Kein Schnittpunkt gefunden.";    
        }    
    }    
    ?>

    Kommentar


    • #3
      habe jetzt nicht wirklich verstanden, was eingegeben werden muss.

      sagen wir,
      Code:
      f(x) = 2x - 1
      Code:
      g(x) = -x + 3
      schnittstelle bei 4/3 ~ 1,3

      Kommentar


      • #4
        ich denke mal, du meinst den html teil.
        also in x1 muss man eine zahl auf der x-achse und y1 auf der y-achse angeben

        Y-Achse
        5 - - - - .
        4 - - - .
        3 - - .
        2 - .
        1 x
        0 1 2 3 4 5 X-achse

        das wäre x=1 und y=1 die steigung wäre 1 die punkte sollen dann von dem programm errechnet werden, und die mit den werten von der 2. linie vergleichen
        (ich hoffe das meintest du)
        die striche sind die leerzeichen

        Kommentar


        • #5
          also in x1 muss man eine zahl auf der x-achse und y1 auf der y-achse angeben
          dan hab ich ja einen punkt, und keine gerade.
          und dann noch separat dazu die steigung angeben.. willst du nicht einen kleinen parser schreiben, der einen string von der art (s. oben) auseinandernimmt? bei linearen gleicheungen wird's wahrscheinlich nicht so schwer sein. aber immerhin richtiger als irgendeine "interpolation".
          Zuletzt geändert von penizillin; 03.08.2005, 22:49.

          Kommentar


          • #6
            umbrich bitte deinen code!

            du willst den schnittpunkt zweier geraden berechnen? das sieht bei dir total kompliziert aus!?

            function:
            PHP-Code:
              //
              // Anzahl der Durchläufe
              //
              
            DEFINE ('ITERATIONS'50);
              
            //
              // Berechnet der Schnittpunkt zweier Geraden mittels des Newton-Verfahrens
              // Als Parameter werden die Koeffizienten der beiden Gleichungen übergeben
              // und ein eventueller Startwert
              //
              
            function calc_newton($a1$b1$a2$b2$start=0) {
                
            //
                // Koeffizienten der Differenz-Funktion berechnen,
                // mit der die Nullstellenbestimmung durchgeführt wird.
                //
                
            $a $a1 $a2;
                
            $b $b1 $b2;
                
            //
                // Sollten die Geraden parallel sein, kehren wir gleich zurück
                //
                
            if ($a == 0)
                  return 
            NULL;
                
            //
                // Jetzt einfach stur x mal (ohne vorzeitiges Abbruchkriterium)
                // Nachfolger berechnen
                //
                
            for ($i=0$i<ITERATIONS$i++) {
                  
            //
                  // Funktionswert und Funktionswert der Ableitung berechnen
                  //
                  
            $y0 $a $start $b;
                  
            $y1 $a;
                  
            //
                  // Nachfolgendes Glied berechnen
                  //
                  
            $start -= $y0/$y1;
                }
                
            //
                // Wahrscheinlichen Schnittpunkt zurückgeben
                //
                
            return array('x' => $start'y' => $a1 $start $b1);
              } 
            wie du siehst, reduziert sich die berechnung auf wenige zeilen, und ... sie kommt (fast) immer auf ein ergebnis, egal, wieviel kommastellen es hat.

            anwendung (beispiel):
            PHP-Code:
              //
              // Koeffizienten der Gleichung
              //
              
            $a1 =  212$b1 = -11.324;
              
            $a2 = -113$b2 192.143;
              
            //
              // Schnittpunkt berechnen
              //
              
            $s calc_newton($a1$b1$a2$b2);
              
            //
              // Ausgeben
              //
              
            echo '
            <code style="white-space:pre;">
            Schnittpunkt zweier Geraden (via Newton-Verfahren)

            y1 = '
            .$a1.'x + '.$b1.'
            y2 = '
            .$a2.'x + '.$b2.'
            '
            ;
              if (
            $s != NULL) {
                echo 
            '
            Schnittpunkt im Punkt S('
            .$s['x'].'/'.$s['y'].')

            '
            .($a1 $s['x'] + $b1).' = '.$a1.' * '.$s['x'].' + '.$b1.'
            '
            .($a2 $s['x'] + $b2).' = '.$a2.' * '.$s['x'].' + '.$b2.'
                '
            ;
              }
              else
                echo 
            $b1 == $b2
                  
            '
            Die Geraden sind identisch und besitzen somit unendlich viele Schnittpunkte.
                    '
                  
            '
            Die Geraden sind parallel und besitzen somit keinen Schnittpunkt.
                    '
            ;
              echo 
            '
            </code>
              '

            nicht ausführlich getestet, aber ...

            wie du aus deiner punkt-steigungs-form die koeffizienten bestimmst, sollte klar sein?

            - a ist die jeweilige steigung
            - b erhältst du aus y = mx + n
            Die Zeit hat ihre Kinder längst gefressen

            Kommentar


            • #7
              bei deinem beispiel kommt das:
              Fatal error: Call to undefined function: calc_newton() in /usr/export/www/vhosts/funnetwork/hosting/flashgordon/mathe2.php on line 10

              Kommentar


              • #8
                das obere stück gehört selbstverständlich auch dazu.

                Kommentar


                • #9
                  ups ...
                  naja jetzt gibt er mir das an, aber ihc finde da kein ergebnis ...
                  Schnittpunkt zweier Geraden (via Newton-Verfahren)
                  y1 = 212x + -11.324
                  y2 = -113x + 192.143
                  Schnittpunkt im Punkt S(0.626052307692/121.399089231)
                  121.399089231 = 212 * 0.626052307692 + -11.324
                  121.399089231 = -113 * 0.626052307692 + 192.143

                  Kommentar


                  • #10
                    Schnittpunkt im Punkt S(0.626052307692/121.399089231)
                    das ist doch das ergebnis. die gerade schneiden sich bei ~ 0,626

                    nimm doch kleinere zahlen:
                    Code:
                    f(x) = 2.5x + 3
                    g(x) = - 0.3x + 4
                    schnitt muss bei 5/14 liegen

                    Kommentar


                    • #11
                      und wie ist das mit der steigung, wo änder ich die ?

                      Kommentar


                      • #12
                        $a1 - steigung der ersten gerade.
                        na, welche variable steht für die steigung der zweiten gerade?

                        Kommentar


                        • #13
                          also muss ich immer den Y-wert von x= 0 angeben ?

                          achja:
                          Schnittpunkt zweier Geraden (via Newton-Verfahren)
                          y1 = 2.5x + 3
                          y2 = -0.3x + 4
                          Schnittpunkt im Punkt S(0.357142857143/3.89285714286)
                          3.89285714286 = 2.5 * 0.357142857143 + 3
                          3.89285714286 = -0.3 * 0.357142857143 + 4

                          Kommentar


                          • #14
                            also muss ich immer den Y-wert von x= 0 angeben ?
                            was meinst du, wofür der zweite koeffizient sonst gut ist?

                            Kommentar


                            • #15
                              aber ihc muss doch den x-wert, den y-wert und die steigung angeben, da sind aber nur 2 variablen ...

                              Kommentar

                              Lädt...
                              X