08-23-2010 09:23 AM
Hallo Zusammen!
Ich nutze gerade VBScript zur automatischen Approximation einer Messreihe. Zu Anfang kann man auswählen, mit welchem Polynom der Ansatz vollzogen werden soll. Die Approximationskoeffizienten speicher ich mithilfe der Variable "ResultApprAnsatzCoefX" in einer ASCII-Datei. Ich hab nun folgendes Problem: Werte ich beispielsweise nur bis zu einem Polynom 4. Ordnung aus, soll er mir beispielsweise die Variable ResultApprAnsatzCoef6 als 0 speichern. Das Script endet aber schon vorher mit der Fehlermeldung Der Index "ResultApprAnsatzCoef6" entspricht keinem Element der Auflistung.
Gibt es ein Befehl mit dem ich abfragen kann, ob dies der Fall ist. Beispielsweise: IsEmpty(..."ResultApprAnsatzCoef6") = True then .... (IsEmpty funktioniert leider nicht)
Danke und Gruß,
Thomas
08-24-2010 02:10 AM - edited 08-24-2010 02:11 AM
Hallo nochmal,
ich bin jetzt einen Schritt weiter. Anstatt mit Data.Root.ChannelGroups(1).Channels(1).Properties("ResultApprAnsatzCoef1").Value nutze ich jetzt die Variable ApprAnsatzCoef(1). Der Vorteil ist, wenn ich den Appr-Ansatz nicht ausgewählt hab führt es nicht mehr zu der im Subject genannten Fehlermeldung, sondern eine 0 wird gespeichert.
Das führt allerdings zu einem neuen Problem:
Der Anwender wählt beispielsweise per Dialog folgenden Appr-Ansatz:
a1*1+a2*x+a5*x^4. In meiner gespeicherten ASCII-Datei soll jetzt folgendes stehen:
1 Wert 'mittels ApprAnsatzCoef(1)
x Wert 'mittels ApprAnsatzCoef(2)
x^2 0 'mittels ApprAnsatzCoef(3)
x^3 0 'mittels ApprAnsatzCoef(4)
x^4 Wert 'mittels ApprAnsatzCoef(5)
Leider ist die Variable ApprAnsatzCoef(i) nicht einer festen Funktion zugeordnet, sondern wird einfach je nach Anzahl der gewählten Appr-Ansätze hochgezählt. Das führt dann in der ASCII Datei zu folgendem:
1 Wert 'mittels ApprAnsatzCoef(1)
x Wert 'mittels ApprAnsatzCoef(2)
x^2 Wert 'mittels ApprAnsatzCoef(3)
x^3 0 'mittels ApprAnsatzCoef(4)
x^4 0 'mittels ApprAnsatzCoef(5)
Ich könnte das jetzt mittels ApprAnsatzName(i) variabel gestelten, brauch aber eine feste Reihenfolge, weil ich die ASCII-Datei in Excel weiterverwenden möchte.
Weiß vielleicht irgendwer einen Ausweg?
Viele Grüße,
Thomas
08-24-2010 02:53 AM
Hallo T.Abeln,
ob ein Property existiert oder nicht kann mit folgendem Befehl abgefragt werden:
Data.Root.ChannelGroups(1).Channels(1).Properties.Exists("PropertyName")
Das Ergebnis ist TRUE oder FALSE
Vielleicht hilft dir das weiter.
Gruß
Walter
08-24-2010 03:20 AM
Hallo Walter,
auf die 1. Frage ist das die Lösung 🙂
Allerdings dachte ich zu dem Zeitpunkt noch, dass die Variable ApprAnsatzCoef(i) fest einem Appr-Ansatz (ApprAnsatzFct(i)) zugeordnet ist und nicht hochgezählt wird nach Anzahl der gewählten Ansätze.
08-25-2010 06:51 AM
Hi Thomas,
kannst du dein Script hochladen? Dann schau ich es mir mal an. Wie speicherst du die ASCII-Datei ab?
RMathews
08-25-2010 07:46 AM
Hi Thomas,
hab grad noch ein bisschen gespielt:
Option Explicit 'Erzwingt die explizite Deklaration aller Variablen in einem Script.
Dim iLoop, iNumber, sText
Call SUDDlgShow("Main", ResourceDrv & "AnaChnApprCalc")
iNumber = 1
For iLoop = 1 to 26
If ApprAnsatzFct(iLoop) = "Yes" Then
sText = sText & ApprAnsatzCoef(iNumber) & vbCRLF
iNumber = iNumber + 1
End If
Next
Call MsgBox(sText)
Ich denke nicht, dass es eine andere Möglichkeit gibt, aber so kann man es ja auch relativ simple machen 😄
LG, RMathews
08-25-2010 08:25 AM - edited 08-25-2010 08:26 AM
Hallo RMathews,
mit so einer ähnlichen Schleife bin ich auch angefangen. Das Problem ist halt das der ApprAnsatzCoef() nach Anzahl der gewählten ApprAnsatzFct() hochgezählt wird und nicht einer Funktion zugeordnet ist. Das kann zum Beispiel bei Auswahl von 8 Funktionen so aussehen:
ApprAnsatzFct (1) | Konstante | x | ApprAnsatzCoef(1) |
ApprAnsatzFct (2) | x | x |
ApprAnsatzCoef(2) |
ApprAnsatzFct (3) | x^2 | x |
ApprAnsatzCoef(3) |
ApprAnsatzFct (4) | x^3 | x |
ApprAnsatzCoef(4) |
ApprAnsatzFct (5) | x^4 | x |
ApprAnsatzCoef(5) |
ApprAnsatzFct (6) | x^5 | ||
ApprAnsatzFct (7) | x^6 | ||
ApprAnsatzFct (8) | x^7 | ||
ApprAnsatzFct (9) | x^8 | ||
ApprAnsatzFct (10) | x^9 | ||
ApprAnsatzFct (11) | x^10 | ||
ApprAnsatzFct (12) | x^11 | ||
ApprAnsatzFct (13) | 1/x | x |
ApprAnsatzCoef(6) |
ApprAnsatzFct (14) | 1/x^2 | x |
ApprAnsatzCoef(7) |
ApprAnsatzFct (15) | 1/x^3 | ||
ApprAnsatzFct (16) | 1/x^4 | ||
ApprAnsatzFct (17) | ln(x) | ||
ApprAnsatzFct (18) | log(x) | ||
ApprAnsatzFct (19) | e^x | ||
ApprAnsatzFct (20) | 10^x | ||
ApprAnsatzFct (21) | sqrt(x) | ||
ApprAnsatzFct (22) | e^(x^2) | ||
ApprAnsatzFct (23) | x^(1/3) | x | ApprAnsatzCoef(8) |
ApprAnsatzFct (24) | 10^(x^2) | ||
ApprAnsatzFct (25) | e^(-x) | ||
ApprAnsatzFct (26) | e^(-x^2) |
Ich gestalte es jetzt doch variabel und hab halt später in Excel den höheren Aufwand. Der relevante Abschnitt aus dem Script sieht dann so aus:
n = 1 Do While (nf+1) > n 'Schleife zum Schreiben der Ansatzfunktion (Name) und dem Koeffizienten bis zu der Anzahl an Funktionen die per Dialog gewählt wurden SchreibFehler = TextFileWriteLn(Dateivariable,ApprAnsatzName(n)&";"&ApprAnsatzCoef(n)) if SchreibFehler <> 0 then call Msgerror(DateiVariable) : Call AutoQuit(Abbruch) else n=n + 1 Loop n0 = 10 - nf Do While 0 < n0 'Schleife zum Auffüllen der Namen und Koeffizienten bis 10 SchreibFehler = TextFileWriteLn(Dateivariable,"0;0") if SchreibFehler <> 0 then call Msgerror(DateiVariable) : Call AutoQuit(Abbruch) else n0=n0 - 1 Loop
Die ASCII Datei sieht dann so aus:
1;186654,896283448
x;1442,91469151125
x^2;-4,71879147416404
x^3;1,20601813352712E-02
x^4;-1,40725605619874E-05
1/x;-1515173,02612808
1/(x^2);11068930,4108822
x^(1/3);-60389,104134634
0;0
0;0
Viele Grüße,
Thomas
08-25-2010 09:34 AM
Hi Thomas,
ich habe meinen Code nochmals kurz angepasst:
Option Explicit 'Erzwingt die explizite Deklaration aller Variablen in einem Script. Dim iLoop, iNumber, sText Call SUDDlgShow("Main", ResourceDrv & "AnaChnApprCalc") iNumber = 1 For iLoop = 1 to 26 If ApprAnsatzFct(iLoop) = "Yes" Then sText = sText & ApprAnsatzName(iNumber) & ";" & ApprAnsatzCoef(iNumber) & vbCRLF iNumber = iNumber + 1 End If Next Call MsgBox(sText)
Meiner Ansicht nach ist das auch variabel - nur die Namen werden übernommen, die auch ausgewählt worden sind 😉
Noch eine Sache - wenn du den String erst zusammenstellst und dann nur einmal schreibst, hast du bessere Performance (nur einen Schreibzugriff auf die Festplatte).
Aber dann läuft es ja jetzt - schön. 😄
08-26-2010 01:34 AM
Guten Morgen RMathews,
ein guter Tip mit den String. Danke für die Hilfestellung.