Autor |
Beitrag |
RoBoTrOn
Hält's aus hier
Beiträge: 6
|
Verfasst: Sa 01.11.08 16:01
Hallo!
Im Rahmen eines schulischen Projekts, befasse ich mich auch mit der Kurvendiskussion und hänge jetzt an den Schnittpunkten.
Ich möchte, dass die Polynomdivision solange ausgeführt wird, bis ich eine quadratische Funktion habe. Ich habe bereits alle mir bekannten Schleifen ausprobiert (for, while, repeat/until).Jedoch komme ich, wie auch in diesem Beispiel, entweder in eine Endlosschleife oder es geschieht rein gar nichts (Es rechnet ganz normal 1 mal die Polynomdivision)
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| exp:= potz; repeat exp1:=exp-1; exp2:=exp1-1; exp3:=exp2-1; ax:= a; an:=ax*n; bx:= b-an; bn:= bx*n; cx:= c-bn; cn:= cx*n; dx:= d-cn; dn:= dx*n; until exp1=2; |
Könntet ihr mir vielleicht behilflich sein?
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: So 02.11.08 12:38
Der Ansatz ist nicht korrekt:
Leg Dir zuerst beide Operanden in je ein Array und setze zwei Zeiger auf den jeweils höchstgewichteten Exponenten. Nennen wir diese Variablen mal exp1_pos und exp2_pos. Initialisiere ein Zielarray mit mindestens sovielen Einträgen, dass das Ergebnis Platz hat - also exp1_pos - exp2_pos + 1.
Solange exp1_pos >= exp2_pos rechnest Du nun operand1[exp1_pos] / operand2[exp2_pos] ==> x, trägst x im Zielarray an der Position exp1_pos - exp2_pos ein und aktualisierst operand1 dadurch, dass du x * operand1 abziehst - ab dem richtigen Offset).
HTH.
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
RoBoTrOn 
Hält's aus hier
Beiträge: 6
|
Verfasst: Sa 15.11.08 11:05
Okay danke für die Antwort.
Jedoch habe ich jetzt festgestellt, die Schleife doch nicht notwendig ist.
Nun habe ich ein weiteres Problem.
Wie bekomme ich das hin, dass wenn Y:=0 ist mir der jeweilige x-wert ausgegeben wird?
an sich ist das nicht das Problem aber da es um Nullstellen geht habe ich mehrere x-werte
Delphi-Quelltext 1: 2: 3: 4: 5:
| x:=-100; repeat y:=(a*power(x,exponent))+(b*power(x,exponent-1))+(c*power(x,exponent-2))+(d*x)+e; inc(x); until y= 0; |
Ich hoffe dass, ich meine Frage halbwegs verständlich formuliert habe.
|
|
crncpz
      
Beiträge: 59
WIN 2000, WIN XP Pro
Delphi 6
|
Verfasst: Sa 15.11.08 14:15
zum bestimmen der Nullstellen helfen dir allgemeingültige lösungsansätze, wie zum bsp
Delphi-Quelltext 1: 2: 3:
| x² + a*x + b = 0 x01 = a/2 + sqrt((a/2)²-b) x01 = a/2 - sqrt((a/2)²-b) |
diese art von lösungsansätzen gibt es bis für polynome 5ter ordnung, alles ab x^6 ist meines wissens nicht mehr ohne erraten einer nullstelle zu lösen.
zum finden von nullstellen könnte dir das newtonferfahren helfen, was einfach gesagte so funktioniert:
der algorithmus kuck links und rechts von einer vermuteten nullstelle und nähert sich dann langsam der realen nullstelle an bis er die genaue nullstelle gefunden hat. das ganze funktioniert glaube über den anstieg der funktion aber ganz genau kann ich mich nicht mehr daran erinnern. zuletzt hatte ich vor über 2 jahren damit zu tun
wenn du dann ne nullstelle hast kannst du mittels polynomdivision die ordnung deines polynoms veringern und wenn nötig das ganze von vorn zu beginnen.
|
|
RoBoTrOn 
Hält's aus hier
Beiträge: 6
|
Verfasst: Sa 15.11.08 16:31
Meine Nullstellen Berechnung bezieht sich auf ganz rationale Funktionen max 4. Grades.
Die Polynomdivision sowie die pq-Formel habe ich bereits fertig. Das Problem ist, dass ich dabei die Nullstellen eingeben muss. Dies wollte ich aber ändern, denn das Programm soll es ja für ausrechnen.
Vorzugsweise würde ich das komplett ohne die Polynomdivision machen deswegen wäre das echt toll, wenn ich das mit einer (oder mehreren) einfachen Schleife(n) machen könnte
ca. so:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| begin exp:= potz; if exp=4 then begin x:=-100; repeat y:=(a*power(x,potz))+(b*power(x,potz-1))+(c*power(x,potz-2))+(d*x)+e; x:=x+1; until y= 0; if y= 0 then n:=x else lbl_ausg.Caption:='keine Nullstelle gefunden!'; |
...was allerdings nicht so funktioniert
|
|
crncpz
      
Beiträge: 59
WIN 2000, WIN XP Pro
Delphi 6
|
Verfasst: Sa 15.11.08 19:20
so findest du natürlich keine nullstellen (in den aller meisten fällen zumindest)
wenn du die nullstellen finden willst empfehle ich dir das newton verfahren
siehe hier: de.wikipedia.org/wiki/Newton-Verfahren
da du für eine kurvendiskussion eh die erste ableitung benötigst und diese für polynome ja auch kein problem dar stellt ist das wohl eine machbare lösung.
ich würde das über ne rekursion machen, in etwa so:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| procedure newton(startpunkt: real; polynom, ableitung: tpolynom;):real; var anstieg, offset, x0: real; begin anstieg := ableitung(startpunkt); offset := polynom(startpunkt) - anstieg*startpunkt; x0 := -offset/anstieg; if polynom(x0)=0 then newton := x0 else newton := newton(x0, polynom, ableitung); end; |
ist nicht getestet und muss noch angepasst werden, also nur ein ansatz
um einen geeigneten startpunkt zu finden kannst du ja ne schleife durchlaufen lassen und wenn der wert nahe 0 ist setzt du das newton verfahren an. das ganze musste du dann eben für nen großen bereich von x machen.
edit:
den startpunkt könnte man so suchen:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| var n : integer; mullstelle : array of real;
n:=0; for i:=-1000 to 1000 do begin if (polynom(i) < 0) and (polynom(i+1) > 0 ) then begin inc(n) setlength(nullstelle,n); nullstelle[n-1] := newton(i+0,5, polynom,ableitung); end; end; |
die frage ist welche grenzen für i gesetzt werden, das sollte man wohl abhängig von den exremwerten und wendepunkten machen wobei man dafür auch wieder eine nullstellen berechnung braucht 
|
|
nagel
      
Beiträge: 708
Win7, Ubuntu 10.10
|
Verfasst: So 16.11.08 00:53
crncpz hat folgendes geschrieben : |
diese art von lösungsansätzen gibt es bis für polynome 5ter ordnung, alles ab x^6 ist meines wissens nicht mehr ohne erraten einer nullstelle zu lösen. |
Lösungsformeln gibt es nur bis zum 4. Grad.
Aber da ja nicht mehr gefragt war, ist es wohl einfacher, diese zu verwenden, als das Newton-Verfahren einzusetzen.
|
|
|