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