2016-04-17 8 views
1

Ich habe mehr Funktionen f1 (x), f2 (x) ... fn (x). Jede Funktion wird, einen Datensatz zu passen genannt v (i) Jeder dieser Form hat beispielsweise: F1 (x) = a1 * x Nun würde Ich mag, alle von ihnen plotten, indem eine for-SchleifeMehrere Fitparameter in gnuplot

Aufruf
plot for [i=i0:ie:di] v(i) using 1:($3) 

so weit so gut. Nun möchte Ich mag a1 nennen, a2, a3..etc für jedes i, zum Beispiel die Daten neu zu skalieren, und ich würde es so

plot for [i=i0:ie:di] v(i) using 1:($3/a(i)) 

wo

a(i)=sprintf("a%01.0f",i) 

Das Problem schreiben besteht darin, von einer Zeichenkette zu einer Gleitkommazahl überzugehen und sie zu gnuplot als einen definierten Parameter zu erkennen. Ich habe versucht, Null hinzuzufügen, um die implizite Umwandlung zu machen, aber es funktioniert nicht. Auch wenn ich drucke

Hat jemand eine Idee zu erreichen, meine a (i) zu bekommen?

Danke Ihnen für jede Anregung

Sie Dank für die reale Funktion Vorschlag, aber ich habe noch folgendes Problem bekommen, die als diese Minimalbeispiel zu sehen ist

a1=12 
a(x)=sprintf("a%01.0f",x) 
print real(a(i)) #want to get 12 here 
Non-numeric string found where a numeric expression was expected 
+0

Ich aktualisierte die Antwort. In deinem Fall musst du 'i = 1; print real (Wert (a (i))) '. Hoffe das behebt das Skript – bibi

+0

Danke, die Wertfunktion war der fehlende Teil ... – Moonpalacio

Antwort

1

Sie müssen die Wert Funktion verwenden (siehe help value). Die Wert Funktion akzeptiert eine Zeichenfolge und gibt den Wert der Variablen zurück, deren Name diese Zeichenfolge ist.

Zum Beispiel

a1 = 2 
a2 = 3 
a3 = 1 

plot for[i=1:3] x**value(sprintf("a%d",i)) t sprintf("a%d",i) 

enter image description here

für jeden Wert von i Hier erzeugt, bauten wir den Namen einer Variablen mit sprintf("a%d",i) bis die a1 liefert, a2 oder a3 je nach dem Wert von i. Um den Wert der Variablen zu erhalten, übergeben wir diese Zeichenfolge an die Wert Funktion, die die Zeichenfolge als den Namen einer Variablen behandelt und den Wert nachschlägt. Wir sehen, dass die Kurve für a1 ist x^2 (als a1 2), die Kurve für a2 ist x^3 (als a2 3 ist), und die Kurve für a3 x ist (wie a3 ist 1).

In Ihrem Fall, können Sie einfach Ihre a (i) Funktion als

a(i)=value(sprintf("a%01.0f",i)) 

und dann a (1) wird der Wert von a1, a (2) definieren wird der Wert a2 und so weiter sein. Mit dieser Änderung funktioniert Ihr Code genauso wie geschrieben.

-1

eine Zeichenfolge konvertieren mit einem Schwimmer, haben Sie die real Funktion:

my_val=2.3 
my_str=sprintf("%f",my_val) 
print my_str # this is a string 
print real(my_str) # this is a float 

von help real:

Die real(x) Funktion gibt den Realteil des Arguments.

wenn x ist eine Stringfunktion (das heißt Funktion, die den Namen einer Variablen zurückgibt) Sie auf den value Funktion verwenden müssen:

a1=12 
a(x)=sprintf("a%01.0f",x) 
print real(value(a(1))) 

P. S. Sie haben auch die int Funktion, die das gleiche mit ganzen Zahlen tut

Andernfalls Sie benötigen, falls ein Array zu speichern (die gnuplot nicht in der Lage ist), die Sie bei diesem Vorschlag sehen möchten: https://stackoverflow.com/a/35729052/2743307