Numerik-Bibliothek für Lazarus

Für Dinge zum Forum, Kritik, Verbesserungsvorschläge, Umfragen und ähnliches.
wp_xyz
Beiträge: 3308
Registriert: Fr 8. Apr 2011, 09:01

Re: Numerik-Bibliothek für Lazarus

Beitrag von wp_xyz »

Einen Vektor mit einer Zahl zu multiplizieren, oder eine Matrixmultiplikation - das sind schlechte Beispiele. Wenn es nur um sowas geht, würde ich lieber die Schleifen schreiben oder die entsprechenden Routinen lokal implementieren als mich in eine umfangreiche Mathematik-Bibliothek einzuarbeiten, Bequemlichkeit hin oder her. Erst ab Matrix-Inversion, Eigenwerten etc. wird eine Mathe-Bibliothek interessant.

ErnstVolker
Beiträge: 241
Registriert: Di 17. Feb 2009, 10:44
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: Numerik-Bibliothek für Lazarus

Beitrag von ErnstVolker »

Ich habe in Python ein Weg-Zeit-Diagramm gebastelt. Eine der dort dargestellten Kurven setzt sich aus drei Teilbereichen zusammen. Das funktioniert mit "numpy" hervorragend mit nur 15 Zeilen Code. Also sowas wie numpy und scipy für Lazarus wäre schon nicht schlecht.

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 630
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Winux (L 2.0.7 FPC 3.04)
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: Numerik-Bibliothek für Lazarus

Beitrag von fliegermichl »

Du kannst dafür aber auch einen Operator überschreiben. Das Beispiel hat ein Formular mit einem Edit und einem Button. In das Edit muss eine Zahl eingetragen werden.

Code: Alles auswählen

 
unit Unit1;
 
{$mode objfpc}{$H+}
 
interface
 
uses
 Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls;
 
type
 
 { TForm1 }
 
 TForm1 = class(TForm)
  Button1: TButton;
  Edit1: TEdit;
  procedure Button1Click(Sender: TObject);
 private
 
 public
 
 end;
 
 TVector = record
   x, y, z, w : Single;
 end;
 
operator + (V : TVector; Wert : Single) : TVector;
 
var
 Form1: TForm1;
 
implementation
 
operator+(V: TVector; Wert: Single): TVector;
begin
 Result.x := v.x + Wert;
 Result.y := v.y + Wert;
 Result.z := v.z + Wert;
 Result.w := v.z + Wert;
end;
 
{$R *.lfm}
 
{ TForm1 }
 
procedure TForm1.Button1Click(Sender: TObject);
var v : TVector;
begin
 with v do
 begin
   x := 1;
   y := 2;
   z := 3;
   w := 1;
 end;
 v += StrToFloat(Edit1.Text);
 MessageDlg(Format('Ergebnis: x=%.3f y=%.3f z=%.3f w=%.3f', [v.x, v.y, v.z, v.w]), mtInformation, [mbOk], 0);
end;
 
end.
 

Warf
Beiträge: 1480
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: MacOS | Win 10 | Linux
CPU-Target: x86_64
Wohnort: Aachen

Re: Numerik-Bibliothek für Lazarus

Beitrag von Warf »

Soweit ich weiß wird es sehr oft so gemacht das man einfach nur wrapper auf bereits bestehende Bibliotheken wie BLAS verwendet. Numpy für Python z.B. macht nichts anderes als aus dem Python Code Fortran un C Bibliotheken aufzurufen. Diese bibliotheken sind natürlich zum einen schneller als alles was man in Python schreiben könnte (ist ja immernoch nur eine Scriptsprache) und gleichzeitig sind die von Profis geschrieben die die auch bis zum gehtnichtmehr optimiert haben. Ich würde an deiner Stelle danach mal ausschau halten.

ErnstVolker
Beiträge: 241
Registriert: Di 17. Feb 2009, 10:44
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: Numerik-Bibliothek für Lazarus

Beitrag von ErnstVolker »

Guten Morgen,

hallo fliegermichel, hallo warf,

vielen Dank für Eure Tips.

Armadillo macht vermutlich auch nix anderes als einen Wrapper auf DLL's.

Das mit "operator +" ist nicht schlecht. Damit kann man sich das Addieren und Multiplizieren schon mal etwas erleichtern.

DANKE!

Schönes WE

Volker

ErnstVolker
Beiträge: 241
Registriert: Di 17. Feb 2009, 10:44
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: Numerik-Bibliothek für Lazarus

Beitrag von ErnstVolker »

Guten Abend im Forum,

ich packe mein Anliegen mal hier hin, da es entfernt mit Gebastel an Vektoren zu tun hat.

Ich bin hier : http://lists.freepascal.org/pipermail/f ... 53891.html darauf gestoßen, dass man "Concat" auch auf Arrays anwenden kann. Und als Schreibweise sollen eckige Klammern funktionieren. Wenn ich aber das hier:

Code: Alles auswählen

Program Beispiel;
var
   t: array of LongInt;
   t2: array of array of LongInt;
begin
   t := [1, 2, 3, 4];
   t2 := [[1, 2, 3], [4, 5]];
end.


ausprobiere, dann kommen folgende Fehlermeldungen:

Beispiel.pas(6,9) Error: Incompatible types: got "Set Of Byte" expected "{Dynamic} Array Of LongInt"
Beispiel.pas(7,11) Error: Ordinal expression expected
Beispiel.pas(9) Fatal: There were 2 errors compiling module, stopping

Fatal: Compilation aborted
Error: /usr/local/bin/ppcx64 returned an error exitcode
Kompilierung fehlgeschlagen.

Müssen hier Compilerschalter gesetzt werden? Wenn ja, welche?

Vielen Dank und viele Grüße

Volker

Antworten