Programmiersprachen (Re: [linux-l] Ruby: sehr cool, aber laaaahm... wie geht's schneller?! - D?)
Oliver Bandel
oliver at first.in-berlin.de
Mi Aug 23 16:26:00 CEST 2006
On Wed, Aug 23, 2006 at 02:40:43AM +0200, Oliver Bandel wrote:
[...]
> Und nun noch was zum Coden,
> damit der lahme Haufen hier mal etwas in Bewegung kommt: ;-)
>
>
> Aufgabe:
> ========
>
> Programmiere ein kleines Progrämmchen, das Dir für
> mathematische Funktionen für einen bestimmten Wertebereich
> den Wert der unahängigen Variable, des Funktionswertes für
> diese Variable und die erste Ableitung (Differentiation)
> der Funktionen am Punkte der unabhängigen Variable ausgibt.
>
> Es soll also berechnet/ausgegeben werden für einen bestimmten x-Wert
> (genauer ein Intervall von x-Werten):
> x, f(x) und f'(x).
>
> Zu jeder Reihe von Werten soll für die jeweilige Funktion noch eine Titelei
> ausgegeben werden, damit man als Betrachter der Ausgaben weiss, für welche
> Funktion man denn die Zahlenwerte ausgegeben bekommt.
> (Also eine Überschrift zu den Berechnungen jeweils.)
>
> Die Vorgaben für den Wertebereich x können im Programm hart kodiert sein,
> es muß kein Code für CLI-Parsing oder GUIs entworfen werden, es geht
> um die reine Programmierung der Funktionalität der Berechnung (und
> deren Ausgabe und der Ausgabe der "Titel"/"Überschriften").
>
> Allerdings soll die Liste der Funktionen, für die man die Werte f(x) und f'(x)
> berechnen möchte, leicht aktualisierbar sein, so daß man auf einfache
> Weise weitere Funktionen hinzu fügen kann.
>
> Es sollen für vier Funktionen die Werte berechnet werden:
>
> sin, cos, x^2, x^3
>
> und x soll von 0 bis 6.3 in Schritten a 0.1 vorgegeben werden.
> (parametrisiert ist fein, aber hardcodet sei für x auch OK).
>
>
> Du hast eine Stunde Zeit für die Implementierung; die Wahl der Programmiersprache
> steht Dir frei.
>
> Viel Spaß dabei!
>
[...]
Also ich musste auch die Formel der Ableitung noch in eine
brauchbare Form bringen (Herleitung und Umformung usw.)
und brauchte doch wesentlich weniger Zeit, als die Stunde.
Also (m)eine OCaml-Lösung sieht so aus:
=======================================================================================
(* -------------------------------------------------------------------- *)
(* This function is for calculating the numerical derivation for a *)
(* function f with lower x-value at x and higher x-value at *)
(* x + epsilon. *)
(* -------------------------------------------------------------------- *)
let derive f x epsilon = ( f(x +. epsilon) -. f x ) /. epsilon
(* --------------------------------------------------------------- *)
(* This function calculates the derivative with an epsilon = 0.001 *)
(* --------------------------------------------------------------- *)
let myderive f x = derive f x 0.001
(* -------------------------------------------------------------------- *)
(* List of pair, where the pairs are of type ( float -> float, string ) *)
(* This will be feed into the calculating function. *)
(* -------------------------------------------------------------------- *)
let function_list_with_titel = [
(sin, "Sinus");
(cos, "Kosinus");
((fun x -> x *. x), "Quadrat (Parabel)");
((fun x -> x *. x *. x), "Kubik") ]
let _ =
List.iter (fun func_and_titel ->
Printf.printf "\n\nBerechnung von %s:\n" (snd func_and_titel);
let func = fst func_and_titel in
for step = 0 to 63 (* steps *)
do
let x = float_of_int step *. 0.1 in
let y = func x in
let y' = myderive func x in
Printf.printf "x: %f, y: %f, y': %f\n" x y y'
done
) function_list_with_titel
=======================================================================================
Vorschläge in anderen Sprachen?
(Perl, Java, C, ...?!)
Gruß,
Oliver
Mehr Informationen über die Mailingliste linux-l