2017-06-02 9 views
0

Ich habe ein Robertson-Diagramm und ein PD-Diagramm für Divisionalgorithmen. Sie sehen aus wie etwas in den Bildern am Ende dieses Beitrags. Ich habe im Grunde eine C++ - Programme, die alle erforderlichen Parameter ableiten, so dass ich nur eine Art von Skripten schreiben müssen, die alle diese Zeilen zusammen darstellt.Plot Robertson-Diagramm/PD-Diagramm mit Gnuplot

das PD-Diagramm betrachtet, entspricht dies mit Steigungen m[0],...,m[n-1] und daher y = m[0]*x,...,y = m[n-1]*x[x0,x1] für einige x Plotten. Was ist der schnellste Ansatz, um das zu erreichen? Ich habe überlegt, meinen C++ - Code zu erweitern, um einige Skriptdateien auszuspucken, die von gnuplot ausgeführt werden können, aber ich habe sie nie benutzt, also weiß ich nicht, was das Format oder was ich im Allgemeinen brauche.

Vielleicht ist es etwas wirklich albernes, oder ich weiß einfach nicht, was ich eigentlich tun muss.

Robertson diagramPD-diagram

Antwort

0

Unter der Annahme, dass Ihre Neigungsdaten in einer Datei in jeder Zeile mit einem Wert sind, können Sie es auf eine Zeichenfolge umwandeln und dann als Array. Daten werden mit dem Dienstprogramm tr konvertiert, indem EOL-Zeichen in Leerzeichen ersetzt werden. Dann wird jeder Wert in der Funktion f(k,x) in einem Bereich [x1:x2] verwendet. Hier

ist Datenfile:

$ cat rob.dat 
20 
10 
5 
2 
-2 
-5 
-10 
-20 

Es wird umgewandelt: 20 10 5 2 -2 -5 -10 -20 und in einer Variablen a gespeichert.

Mit png Terminal, können Sie ein Bild, aber ohne kursiven Symbole:

set term pngcairo enh mono solid lw 1.5 font "Helvetica,14" size 600,800 
set output "rob.png" 
set nokey 
set noborder 
set noxtics 
set noytics 
x1=-0.1 
x2=10.0 
f(k,x)=(x>=x1 && x<=x2 ? k*x : 1/0) 
a=system("tr '\\n' ' ' < rob.dat") 
v(n)=word(a,n) 
set style arrow 1 head size 0.2, 25 filled 
set arrow from x1-1,0 to x2+1.,0 arrowstyle 1 
set arrow from 0.,f(v(8),x2) to 0.,f(v(1),x2) arrowstyle 1 
set arrow from 4.,100. to 7.,60. arrowstyle 1 front 
set label "Selection interval\nfor {/:Italic q_{j+1} = k}" at 1.,120. 
set label "{/:Italic U_a = r{/Symbol r}d}" at x2+0.1, f(v(1),x2) 
set label "{/:Italic U_k}" at x2+0.1, f(v(2),x2) 
set label "{/:Italic L_k}" at x2+0.1, f(v(3),x2) 
set label "{/:Italic U_0}" at x2+0.1, f(v(4),x2) 
set label "{/:Italic L_0}" at x2+0.1, f(v(5),x2) 
set label "{/:Italic U_k}" at x2+0.1, f(v(6),x2) 
set label "{/:Italic L_k}" at x2+0.1, f(v(7),x2) 
set label "{/:Italic L_{-a} = -r{/Symbol r}d}" at x2+0.1, f(v(8),x2) 
set label "{/Italic rw[j]}" at 0.3,f(v(1),x2) 
set label "{/Italic k} < 0" at 2.,-130. 
set style fill solid 0.3 
plot [-2:12][] for [b in a] f(b,x) w l lw 2 lc rgb "black", "+" u 1:(f(v(2),$1)):(f(v(3),$1)) w filledcurves 

enter image description here

Nachsatz eps Terminal verwenden, können Sie diejenigen bekommen (zwei erste Linien ersetzen):

set term post eps enh mono solid lw 2 font "Helvetica,30" size 6 in,9 in 
set output "rob.eps" 

enter image description here

+0

Hallo ich lese durch Ihre Antwort äh, welche Version von gnuplot benutzt du? Ich habe die 4.0. Ich bin mir nicht sicher, ob dein Code auch für mich funktionieren würde. – user8469759

+0

Meine Version ist 4.6. Aktualisieren Sie gnuplot, denn das ist eine ziemlich alte Version. –

Verwandte Themen