2017-06-02 1 views
0

Je dois tracer un diagramme de Robertson et un diagramme de pd pour les algorithmes de division. Ils ressemblent à quelque chose dans les images montrées à la fin de ce post. J'ai fondamentalement un programme C++ qui dérive tous les paramètres nécessaires. Je dois donc écrire des scripts qui tracent toutes ces lignes ensemble.Tracer le diagramme de robertson/diagramme pd en utilisant gnuplot

Compte tenu du schéma de PD, ce qui correspond à des pentes ayant m[0],...,m[n-1] et donc complotant y = m[0]*x,...,y = m[n-1]*x pour certains x[x0,x1]. Quelle est l'approche la plus rapide pour y parvenir? Je pensais à étendre mon code C++ pour cracher un fichier de script qui peut être exécuté par gnuplot, mais je ne l'ai jamais utilisé donc je ne sais pas quel devrait être le format ou ce dont j'ai besoin en général.

Peut-être que c'est quelque chose de vraiment idiot, ou peut-être que je ne sais pas ce dont j'ai besoin pour le faire.

Robertson diagramPD-diagram

Répondre

0

En supposant que vos données de pente est dans un fichier avec une valeur dans chaque ligne, vous pouvez le transformer en une chaîne et utiliser ensuite sous forme de tableau. Les données sont converties avec l'utilitaire tr en remplaçant les caractères EOL par des espaces. Chaque valeur est ensuite utilisée dans la fonction f(k,x) dans la plage [x1:x2].

Voici datafile:

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

Il est converti en: 20 10 5 2 -2 -5 -10 -20 et stocké dans une a variable.

Avec terminal .png, vous pouvez obtenir une image, mais sans symboles italique:

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

Utilisation du terminal EPS Postscript, vous pouvez obtenir (remplacement deux premières lignes):

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

Salut, je lis à travers votre réponse euh, quelle version de gnuplot utilisez-vous? J'ai le 4.0. Je ne sais pas si votre code fonctionnerait aussi pour moi. – user8469759

+0

Ma version est 4.6. Mettez à jour gnuplot parce que c'est une version assez ancienne. –