GNU Octave ezmesh (war: Einfaches Funktionsplotten mit freier Software?)

sia

gesperrt
Registriert
26 März 2015
Beiträge
5.926
Ort
FFM (NSFW)
Hi Leute,

Ich nutze gerne Wolfram Alpha, aber mittlerweile ist mir das selbst mit Hochschullizenz etwas zu teuer (darf dafür 4€/Monat abdrücken).

Gibt es eine ähnlich einfach zu bedienende Alternative, vorzugsweise FLOSS (also dass ich auch das "Hintendran" nachvollziehen kann)? Eine Ausgabe in JS oder EPS würde mir weiter helfen, damit ich das in anderen Programmen weiterverarbeiten kann.

EDIT: Wäre vielleicht sinnvoll, ein Beispiel zu nennen.

Ich habe eine Funktion, die so aussieht:
z=(x^2+y^2)*e^(−x)

Und die Schnittfläche (Tangentialebene) ungefähr so:
z=−x+2y−1
 
Zuletzt bearbeitet:
Re: Einfaches Funktionsplotten mit freier Software?

Octave als Open Source Variante zu Matlab vielleicht.
Eher für numerische Berechnungen, aber plotten kann es ;).





Ein kleiner spontantest mit Octave zu deinem Beispiel:
plottest.png

Erzeugt durch diesen code:
[src=matlab]
f = @(x,y) (x.^2+y.^2).*exp(-x);
range = [-2:0.1:2];
[x,y] = meshgrid(range, range);
z = f(x,y);
surf(x,y,z);
hold on;
t = @(x,y) (-x+2.*y-1);
zt = t(x,y);
surf(x,y,zt);
[/src]

Optik lässt sich generell sehr gut und umfangreich anpassen (jedenfalls bei Matlab, wird bei octave aber ähnlich sein).
 
Zuletzt bearbeitet:
  • Thread Starter Thread Starter
  • #3
Re: Einfaches Funktionsplotten mit freier Software?

Okay, habe jetzt folgenden Code:

Code:
Expand Collapse Copy
f = @(x,y) (x.^2+y.^2)*e.^(-x);
ezmesh (f, [-3, 3]);
g = @(x,y) (-x+2.*y-1);
ezmesh (g, [-3, 3]);

so weit, so einfach – aber das wird irgendwie nicht in demselben Koordinatensystem angezeigt, sondern getrennt.

Wie schaffe ich ersteres?

EDIT: Du Arsch, das war ein Ninja Edit!

Kann man das noch irgendwie so darstellen, dass man die Tangentialebene als solches erkennt? Also den Graphen von f(x,y) vielleicht bisschen transparent machen?
 
Der Befehl
[src=matlab]hold on;[/src]
lässt weitere plots ins selbe Koordinatensystem plotten.
mit subplot kann man dann noch alternativ ins selbe Bild mehrere Koordinatensysteme plotten.

--- [2016-05-05 10:09 CEST] Automatisch zusammengeführter Beitrag ---

hm, tja, eigentlich ergibt sich Transparenz mit
[src=matlab]
handle = surf(x,y,z);
set(handle,'facealpha',0.8);
[/src]
Allerdings heißt es :
facealpha: scalar | matrix, def. 1

Transparency is not yet implemented for surface objects. facealpha is unused.
Dementsprechend führt ein Wert ungleich 1 zu 100%iger Transparenz.

PS.: Aber siehe für einen möglichen Workaround:
aKwab.png
 
Zuletzt bearbeitet:
  • Thread Starter Thread Starter
  • #5
Ich hatte [kw]hidden off[/kw] jetzt auch gefunden, allerdings sieht das irgendwie scheiße aus. Kann ich die Fläche einfärben, damit sie nicht höhenabhängig eingefärbt ist?

Also ich hätte gerne einmal die Grundfunktion als blaues Mesh, dann die Tangentialebene als dunkelrot eingefärbte Fläche und den Schnittpunkt (0;1;1) als roten Puinkt. Das Mesh sollte durchsichtig sein (also hidden off), die Fläche halbtransparent.

Sorry, bin etwas noobig unterwegs, wir hatten nur eine zweistündige Einführung in MATLAB und nur maximal 2D-Funktionen geplottet :D

EDIT: und die Achsen sollten mit x,y,z beschriftet sein :D

Geht das überhaupt so, wie ich das vorhabe? RTFM sagt nein :/

EDIT2: Na ja, sieht zwar nicht 100% perfekt aus, aber ich hab jetzt keine Lust mehr:

[src=matlab]clf;
f = @(x,y) (x.^2+y.^2).*exp(-x);
ezmesh (f, [-0.5, 1.5]);
hidden off;
hold on;
g = @(x,y) (-x+2.*y-1);
z = g(x,y);
tangential = surf(x,y,z);
set(tangential,'FaceColor',[0.5 0.7 0.9],'EdgeColor','none');
point = plot3(0,1,1,'.');
set(point,'MarkerSize',10,'Color','black');[/src]

3Ie6Of1.png


EDIT3: wie mache ich das, dass das nur von z = -4 gezeichnet wird?
 
Zuletzt bearbeitet:
So sieht der Versuch bei mir aus :D

octavetest.png
Ich bin gerade etwas enttäuscht, denn dieser rote Bereich um den Schnittpunkt herum ist im plot selber nicht so, nur jetzt im Bild. Octave scheint in dem Bereich eine Lücken und Schwächen zu haben.

[src=matlab]
range = [-2:0.1:2];
[x,y] = meshgrid(range, range);
f = @(x,y) (x.^2+y.^2).*exp(-x);
t = @(x,y) (-x+2.*y-1);
z = f(x,y);
zt = t(x,y);

h = surf(x,y,z);
hold on;
ht = surf(x,y,zt);
hs = scatter3(0,1,1);

set(h, 'facecolor', 'none')
set(h, 'edgecolor', [0 0 1]);
set(ht,'edgecolor','none');
set(ht,'facecolor',[0.7 0.1 0.1]);
set(hs, 'linewidth', 15);
set(hs,'markerfacecolor',[1 0 0]);
[/src]

Achsenlimit sowie Bezeichnungen kannst du über einstellen. Ich muss gestehen, dass ich solcherlei bei matlab oft mit dem hervorragenden Editor einstelle und daher nur begrenzt auswendig kenne :D.


Ich denke die wesentlicher Frage ist, welche ästhetischen Anforderungen du an die Plots hast. Ich denke zur reinen Visualisierung wird man alles was man braucht Präsentationsgerecht hinkriegen. Deins finde ich so schon ganz hübsch, wenn man da noch bisschen was an den achsen werkelt und evtl noch die Perspektive entsprechend wählt.
Bin aber grad ganz froh, bisher immer noch mit matlab arbeiten zu können :D.
 

Anhänge

  • octavetest.png
    octavetest.png
    368,6 KB · Aufrufe: 150
Zuletzt bearbeitet:
  • Thread Starter Thread Starter
  • #7
Aaha! [kw]axis([-0.5 1.5 -0.5 1.5 -4 4]);[/kw], sieht so aus:

5j7XM7i.png


Jetzt habe ich den nächsten Spaß:
z = 3⋅sqrt(x²/y²) + 2⋅cos(π(x+2y))

Das ist mein Code:

[src=matlab]clf;
f = @(x,y) 3.*sqrt(x.^2/y.^2) + 2.*cos(pi*(x+2.*y));
ezmesh (f);[/src]

Und der Kack kommt raus:

0pZLDm4.png


Kann das sein? :D

EDIT: AAARRGH MATHE! :'(
 
Zuletzt bearbeitet:
Du hast einen Fehler in der Formel. Der slash "/" ist der Operator zum Lösen eines linearen Gleichungssystem, für die elementweise Division muss "./" verwendet werden.
Beachte auch, dass die Funktion für y=0 nicht definiert ist.

Ich hab hier das raus:
1to6.png
[src=matlab]
f = @(x,y) 3.*sqrt(x.^2 ./ y.^2) + 2.* cos(pi.*(x+2.*y));
range = [1:0.1:6];
[x,y] = meshgrid(range, range);
z = f(x,y);
surf(x,y,z);
[/src]

bzw. so:
-6to6.png
[src=matlab]
f = @(x,y) 3.*sqrt(x.^2 ./ y.^2) + 2.* cos(pi.*(x+2.*y));
range = [-6:0.1:6];
[x,y] = meshgrid(range, range);
z = f(x,y);
surf(x,y,z);
[/src]
 
  • Thread Starter Thread Starter
  • #9
Jetzt wollte ich heute noch die Tangentialebene auf dieselbe Art und Weise wie in meiner ersten Grafik einfügen, aber irgendwie funktioniert das nach dem neu laden nicht mehr..

Mein erster Code:

[src=matlab]
clf;
f = @(x,y) (x.^2+y.^2).*exp(-x);
ezmesh (f, [-0.5, 1.5]);
hidden off;
hold on;
g = @(x,y) (-x+2.*y-1);
z = g(x,y);
tangential = surf(x,y,z);
set(tangential,'FaceColor',[0.5 0.7 0.9],'EdgeColor','none');
point = plot3(0,1,1,'.');
set(point,'MarkerSize',10,'Color','black');
axis([-0.5 1.5 -0.5 1.5 -4 4.2]);
[/src]

und der zweite:

[src=matlab]
clf;
f = @(x,y) 3.*sqrt(x.^2./y.^2) + 2.*cos(pi*(x+2.*y));
ezmesh (f);
hidden off;
hold on;
g = @(x,y) (3*x-3*y+5);
z = g(x,y);
tangential = surf(x,y,z);
[/src]

Und jetzt werden nur die "ezmesh"es angezeigt, nicht die "surf"s... Hatte ich da im interaktiven Modus irgendwo etwas gesetzt, was die angezeigt hat?

Ich komme mir echt vor, wie der letzte Idiot. Na ja, wenigstens bringe ich mir mit deiner Hilfe das selbst etwas bei :D
Habe auch gestern mein erstes lineares Gleichungssystem gelöst :p
 
TL;DR: Du musst noch x und y passend initialisieren ;).


Er zeigt mir an:
>> z = g(x,y);
error: 'x' undefined near line 1 column 7
Das war sicherlich nicht didaktisch astrein von mir.. :D, schauen wir mal:
Wenn du
[src=matlab]f = @(x,y) [...] [/src]
schreibst heißt das sowas wie: "x und y bitte als Symbole verstehen, es sind keine (initialisierten) Variablen"
Matlab/Octave sind ja primär Tools für wissenschaftliches Rechnen und dadurch nur "auch" geeignet Funktionen so zu verwenden wie man das intuitiv machen will, also mit x und y als symbolische Variablen statt Variablen im Programmiersinne.
Wenn du dann schreibst:
[src=matlab]z = g(x,y);[/src]
heißt das: "Evaluiere die Funktion g mit den Werten aus den Variablen bzw. Matrizen und weise das Ergebnis (Array) der Variable z zu.
Die x und y an der Stelle haben aber nichts mit dem "@(x,y)" zu tun, sondern müssen eben passende Variablen, sein.
D.h. du brauchst sowas wie
[src=matlab]range = [-1:0.1:1];
[x, y] = meshgrid(range,range)[/src]
Vorher, damit du passend initialisierte Arrays hat.
Die Funktion meshgrid produziert dir quasi die Variablen genau so, wie du sie haben willst. Du willst ja paarweise die Funktion an 'allen möglichen' (bzw. vielen, z.B. in 0.1er Schritten in jede Richtung) Kombinationen innerhalb deiner Range auswerten, vereinfacht also z.B. g(0,0), g(1,0), g(2,0), g(3,0),... g(0,1), g(1,1),.. und so weiter und das baut meshgrid dir.
ezmesh ist da einfach eine Abkürzung und mich würde es nicht wundern, wenn es intern einfach auch auf meshgrid und surf zurückgreift.



LGS ist ja eine klassische Aufgabe für Matlab/Octave. Zumindest Matlab ist dahingehend vielleicht angenehm für den Anwender, als das es immerhin ein wenig die Art des LGS analysiert und entsprechend einen Algorithmus auswählt. Sicherlich spannend, ob Octave das ähnlich/gleich macht und die selben Algorithmen implementiert sind bzw. ausgewáhlt werden.
 
  • Thread Starter Thread Starter
  • #11
Danke, Mann. Ich hab's jetzt endlich kapiert ;)

EDIT: Die Docs von Matlab/Octave sind scheiße, wenn man keine Einführung von jemandem bekommt, der das kann. Just saying.
 
Zurück
Oben