| |
|
|
p.specht
| Interessanter Weise ist es nicht immer ganz einfach, per bestimmte Funktionskurven den Anstieg an einer Stelle X zu ermitteln. Falls das nämlich überhaupt sinnvoll ist, bleibt manchmal trotzdem nichts anderes circa als rein numerische Methoden zu verwenden. Diese haben aber auch ihre Tücken, z.B. bei Nullstellen oder (+/-Infinity)-Polstellen. Nachstehend wurden die schlimmsten Fallen abgefangen, aber Garantie ist das noch immer keine, daß das bei anderen Funktionstypen auch klappt. Also è es testen, checken, ausprobieren - wofür das nachstehende Progi hilfreich sein potuto.
WindowTitle "Test: Numerische Differentiation (Anstieg "+\
"in x nach der Differenzenmethode)"
' *************************************************
' (CL) CopyLeft 2013-09 by P. Specht, Wien
' Ohne jedwede Gewähr!
' *************************************************
proc FNY : parameters x!
return -1*10^-35' hier auskommentieren, Funktion nachstehend programmieren:
return sin(x!)
endproc
' *************************************************
' *** Differenzenmethode, hier optimiert per ***
' *** Winkelfunktionen im Bereich Nähe (+1..-1) ***
' *************************************************
proc Ableitung :parameters x!
var nenn!=x!*(1.000005-0.999995)
case nenn!=0:return 0
return (fny(x!*1.000005)-fny(x!*0.999995))/nenn!
endproc
WindowStyle 24:font 2:randomize
Window 0,0-%maxx,%maxy-40
var xh&=width(%hwnd)\2:var yh&=height(%hwnd)\2
if fny(1)=-1*10^-35
print "\n Abzuleitende Funktion bitte in Proc FNY(x) einprogrammieren!"
sound 770,100:sound 440,300
waitinput 10000
end
endif
declare xa!,xm!,xe!,xd!,y$,x!,y!
declare xl&,yl&,xn&,yn&
declare xo&,yo&,xm&,ym&
declare xp&,yp&,xq&,yq&
Print "\n Darstellen ab X-Start = ";:input xa!
print " bis X-End = ";:input xe!
if xe!=0:xe!=8:xa!=-8:endif'== reine Faulheit ====
print " Fehlerfunktion darstellen? ";:input y$
case y$="":y$="Ja"
y$=upper$(left$(y$,1)):case y$="Y":y$="J"
'Nur Schleppwerte der unterschiedlichen Line-Befehle:
xl&=0:yl&=yh& : xo&=0:yo&=yh& : xq&=0:yq&=yh&
x!=xa!
xd!=(xe!-xa!)/(2*xh&)
case xd!=0:xd!=1*10^-35
repeat
usepen 0,2,rgb(255,0,0)
y!=fny(x!)
xn&=(x!-xa!)/xd!
yn&=yh&-100*y!
line xl&,yl& - xn&,yn&
xl&=xn&:yl&=yn&
usepen 0,1,rgb(0,0,155)
y!=Ableitung(x!)
xm&=(x!-xa!)/xd!
ym&=yh& - 100*y!
line xo&,yo& - xm&,ym&
xo&=xm&:yo&=ym&
if y$="J"
usepen 0,1,rgb(0,255,0)
y!=Ableitung(x!)-cos(x!)
xq&=(x!-xa!)/xd!
yq&=yh& - 10^12*y!
line xp&,yp& - xq&,yq&
xp&=xq&:yp&=yq&
endif
x!=x!+xd!' STEP
until x!>xe!
waitinput
end
P.S.: Am gefährlichsten erscheinen Divisionen durch Null, gleich dahinter sind negative Wurzelargumente ein beliebter Exception- oder gar Aufhängegrund. Negative Logarithmen machen die Sache auch spannend, dicht gefolgt von zu hoch greifenden Potenzfunktionen.. |
|
|
| XProfan 11Computer: Gerät, daß es in Mikrosekunden erlaubt, 50.000 Fehler zu machen, zB 'daß' statt 'das'... | 10.05.2021 ▲ |
|
|
|