AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Potenzreihen: Horner

Ein Thema von Dipl Phys Ernst Winter · begonnen am 26. Jun 2009 · letzter Beitrag vom 25. Nov 2009
Antwort Antwort
Dipl Phys Ernst Winter

Registriert seit: 14. Apr 2009
Ort: Jena
103 Beiträge
 
Delphi 3 Professional
 
#1

Potenzreihen: Horner

  Alt 26. Jun 2009, 16:03
Zur Berechnung von Potentzreihen und iher Ableitung benutzt man das Schema nach Horner. Ich habe dafür zwei Fubnktionen in einer Unit bereitgestellt:
Delphi-Quellcode:
// Funktionsmwert einer Potenzreihe mit
// n Rang
// c[i] i = 0..n Koefiziendenvektor
// x Argument
function HornerFkt(const n: byte; const c: array of extended;
                   const x: extended): extended;
var
  i: integer;
begin
  Result := c[n]; // y nach Horner
  for i:= n-1 downto 0 do Result:= Result*x + c[i]; // berechnen,
end;

// Wert der Ableitung einer Potenzreihe mit
// n Rang
// c[i] i = 0..n Koefiziendenvektor
// x Argument
function HornerAbl(const n: byte; const c: array of extended;
                     const x: extended): extended;
var
  i: integer;
begin
  if n=0 then Result:= 0 else if n=1 then Result:= c[1]
  else begin
    Result:= n*c[n]*x;
    for i:= n-1 downto 2 do Result:= (Result + i*c[i])*x;
    Result:= Result + c[1] end
end;
Angehängte Dateien
Dateityp: zip horner_742.zip (149,7 KB, 8x aufgerufen)
Autor: DP Ernst Winter
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#2

Re: Potenzreihen: Horner

  Alt 27. Jun 2009, 01:01
Sieht ganz nett aus.

Was ich aber noch ändern würde ist der Parameter n. Den kann man ja wohl ersetzen durch high(c) oder nicht?
  Mit Zitat antworten Zitat
Dipl Phys Ernst Winter

Registriert seit: 14. Apr 2009
Ort: Jena
103 Beiträge
 
Delphi 3 Professional
 
#3

Re: Potenzreihen: Horner

  Alt 27. Jun 2009, 09:20
"jfheins"

Zitat:
Was ich aber noch ändern würde ist der Parameter n. Den kann man ja wohl ersetzen durch high(c) oder nicht?
Nein! high(c) würde maxRang, die dimensionierte Länge des Arrays zurückgeben, während der Rang der Potenzreihe benötigt wird.
Autor: DP Ernst Winter
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#4

Re: Potenzreihen: Horner

  Alt 28. Jun 2009, 13:31
Ich denke, man sollte die Parameter seperat erklären, da sie ja nicht "sprechend" sind.

Also z.B.:
Delphi-Quellcode:
// HornerFkt - Berechnet den Funktionswert eines Polynoms
// n: Grad des Polynoms
// c: Koeffizienten des Polynoms (aufsteigend)
// x: Argument
// Rückgabe: Funktionswert an der Stelle x
function HornerFkt(const n: integer; const c: array of extended;
                   const x: extended): extended;
var
  i: integer;
begin
  Result := c[n]; // y nach Horner
  for i:= n-1 downto 0 do Result:= Result*x + c[i]; // berechnen,
end;

// HornerAbl - Berechnet die Ableitung eines Polynoms
// n: Grad des Polynoms
// c: Koeffizienten des Polynoms (aufsteigend)
// x: Argument
// Rückgabe: Ableitung an der Stelle x
function HornerAbl(const n: integer; const c: array of extended;
                     const x: extended): extended;
var
  i: integer;
begin
  Result:= n*c[n]*x; // y' nach Horner
  for i:= n-1 downto 2 do Result:= (Result + i*c[i])*x; // berechnen,
  Result:= Result + c[1]
end;
  Mit Zitat antworten Zitat
gammatester

Registriert seit: 6. Dez 2005
999 Beiträge
 
#5

Re: Potenzreihen: Horner

  Alt 28. Jun 2009, 14:50
Leider ist HornerAbl völlig falsch für n=0, oder n=1!

n=0: y=c[0], y'=0, HornerAbl: c[1]!! Das ist noch nicht mal definiert!

n=1: y=c[0]+x*c[1], y'=c[1], HornerAbl: c[1] + c[1]*x!

Gammatester
  Mit Zitat antworten Zitat
gammatester

Registriert seit: 6. Dez 2005
999 Beiträge
 
#6

Re: Potenzreihen: Horner

  Alt 28. Jun 2009, 17:25
Auch HornerFkt ist buggy. Wenn n ein integer ist, darf Result := c[n] im Fall n<0 nicht ausgeführt werden, andernfalls gibt 'nen Rangecheckerror oder 'nen Crash. Am einfachsten via if n>=0 then Result := c[n] else Result := 0.0;

Entsprechendes gilt selbstredend auch für HornerAbl.

Gammatester
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#7

Re: Potenzreihen: Horner

  Alt 29. Jun 2009, 07:56
Die Rangecheck-Problematik könnte man mit dem richtigen Datentyp implizit vermeiden: Kandidaten wären "Byte","Word" oder "Cardinal".
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
gammatester

Registriert seit: 6. Dez 2005
999 Beiträge
 
#8

Re: Potenzreihen: Horner

  Alt 29. Jun 2009, 09:38
Zitat von alzaimar:
Die Rangecheck-Problematik könnte man mit dem richtigen Datentyp implizit vermeiden: Kandidaten wären "Byte","Word" oder "Cardinal".
Genau! Bei der Gelegenheit kann man sich dann auch um zu großes n kümmern. Es gibt zwei Möglichkeiten: Entweder Rangecheck-Fehler oder Abschneiden. Hier mal ein Codeschnipsel, der hoffentlich alle bisherigen Argumente berücksichtigt.

Delphi-Quellcode:
{$define Horner_RTE}  {Fehler falls n>high(c), sonst wird n auf high(c) beschränkt}

{---------------------------------------------------------------------------}
function HornerFkt(n: cardinal; const c: array of extended; x: extended): extended;
  {-HornerFkt - Berechnet den Funktionswert eines Polynoms}
  { n: Grad des Polynoms                                  }
  { c: Koeffizienten des Polynoms (aufsteigend)           }
  { x: Argument                                           }
  { Result: Funktionswert an der Stelle x                 }
var
  i: cardinal;
begin
  if n>high(c) then begin
    {$ifdef Horner_RTE}
      RunError(201);
    {$else}
      n := high(c)
    {$endif}
  end;
  Result := 0.0;
  for i:= n downto 0 do Result:= Result*x + c[i];
end;

{---------------------------------------------------------------------------}
function HornerAbl(n: cardinal; const c: array of extended; x: extended): extended;
  {-HornerAbl - Berechnet die Ableitung eines Polynoms}
  { n: Grad des Polynoms                              }
  { c: Koeffizienten des Polynoms (aufsteigend)       }
  { x: Argument                                       }
  { Result: Ableitung an der Stelle x                 }
var
  i: cardinal;
begin
  if n>high(c) then begin
    {$ifdef Horner_RTE}
      RunError(201);
    {$else}
      n := high(c)
    {$endif}
  end;
  Result:= 0.0;
  for i:= n downto 1 do Result:= Result*x + i*c[i];
end;
Edit: Habe zu hause noch mal die for-Schleife in HornerAbl korrigiert. :)
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#9

Re: Potenzreihen: Horner

  Alt 25. Nov 2009, 10:44
Ist HornerFkt evtl dasselbe, was in Math.Poly steht?
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
gammatester

Registriert seit: 6. Dez 2005
999 Beiträge
 
#10

Re: Potenzreihen: Horner

  Alt 25. Nov 2009, 12:18
Zitat von sirius:
Ist HornerFkt evtl dasselbe, was in Math.Poly steht?
Fast, aber halt nicht ganz: Bei math.poly hat man keine Wahl, was den Grad des Polynoms betrifft. Wenn poly(x) = c[0] + c[1]*x + c[2]*x^2 + ... + c[m]*x^m ist, kann man bei HornerFkt n<=m eingegeben und math.poly rechnet immer mit n=m.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:35 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz