Autor |
Beitrag |
Endanwender
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mo 23.05.05 23:25
Hallo alle Zusammen!
Ich versuche derzeit krampfhaft mir ein kleines Programm zu schreiben, mit dass sich eine nichtlineare Funktion, bestehend aus der Überlagerung einer quadratischen Funktion mit einem Voigt-Profil , anfitten läßt. Ehrlich gesagt hab ich keine Ahnung wie ich das machen, wollte mich da Stück für Stück rantesten, auch wenn es unter den jetzigen Bedingungen Jahre dauert, obwohl es für meine Diplomarbeit doch von recht großen nutzen wäre.
Deshalb werde ich mal hier meine erste von bestimmt vielen Fragen stellen!
Was jemand zufällig wie ich eine Funktion programmiere, die das Voigt-Profil wiederspiegelt?
ich hab folgendes versucht:
Delphi-Quelltext 1: 2: 3: 4: 5:
| function Voigt(x,x0,y0,wL,wG,nu,A: Extended):Extended; begin Voigt:=y0+A*(nu*(2/Pi)*(wL/(4*(x-x0)+sqr(wL)))+(1-nu)*(sqrt(4*Ln(2)) *(sqrt(Pi)*wG))* Exp(-1*(4*Ln(2)/sqr(wG)*sqr((x-x0))))); end; |
Schöne Grüße
der Endanwender
PS: Im Dateianhang hab ich mal das Layout dargestellt was ich denke zu machen! Der Graph stellen die Messwerte da, die irgendwann einmalangefittet werden sollen. Bloß wie?
Moderiert von raziel: Delphi-Tags hinzugefügt.
Einloggen, um Attachments anzusehen!
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Di 24.05.05 07:30
Hi!
Ist es Teil der Diplomarbeit, ein eigenes Tool zu schreiben? Falls nicht, solltest Du mal schauen, ob es dort, wo Du die Diplomarbeit machst, das Programm "Origin" gibt. Der fittet auch Voigt-Profile (okay, es gibt wenig, was der nicht fittet  ). Das würde Dir eine Menge Arbeit ersparen und Du könntest Dir wesentlich sicherer sein, dass die Ergebnisse korrekt sind. (Obwohl ich Origin vorige Woche zur Strecke gebracht habe  )
Grüße
Christian
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
Endanwender
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Di 24.05.05 08:33
Naja, Bestandteile meiner Diplomarbeit ist es nichts ein Programm zu schreiben! Aber das Fitten der Messdaten schon! Und ehrlich gesagt, haben wir Origin, aber ich hab keine Ahnung wie ich damit eine nichtlineare Kurve fitte. Vor allem durch die Komplexität der Messdaten!
Ideen nehme ich gerne entgegen!
Und die Programmierung solche eines Programms soll nur dazu dienen bisschen Programmieren zu lernen! Naja, wäre schön wenn es was wird, aber naja!
MFG
der Endanwender
|
|
alzaimar
      
Beiträge: 2889
Erhaltene Danke: 13
W2000, XP
D6E, BDS2006A, DevExpress
|
Verfasst: Di 24.05.05 21:36
Äh, gehts hier um nonlineare Regression oder dergleichen? Ich meine, kennst Du in etwa die Stammfunktion? Ich habe hier ein Modul, das beliebige Funktionen an eine Punkteschar 'anfittet', man benötigt die Stammfunktion (y=ax+sin(y)*b+ exp(z/cos(c))) sowie die Ableitung.
Oder musst Du nur hinreichend glatte Kurven durchzeichnen. Dann nimm Bezierkurven.
|
|
Endanwender
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mi 25.05.05 13:05
alzaimar hat folgendes geschrieben: | Äh, gehts hier um nonlineare Regression oder dergleichen? Ich meine, kennst Du in etwa die Stammfunktion? Ich habe hier ein Modul, das beliebige Funktionen an eine Punkteschar 'anfittet', man benötigt die Stammfunktion (y=ax+sin(y)*b+ exp(z/cos(c))) sowie die Ableitung. |
Jep es ist eine nichtlineare Regression! Die Funktion besteht aus einem Polynom 2.Ordnung überlagert mit dem Lambertschen Gesetz! Ungefähr so: FIT=(L*x*x+m*x+n)*(I*Exp(Voigt(x,x0,wL,wG))! Hierbei entspricht Voigt der Profilfunktion! Und darum suche ich eine numerische Funktion, die das Voigt-Profil wiederspiegelt!
Nun hab ich aber auch noch ne andere Frage:
Ist es möglich, dass man in einer For-Schleife mehrere Edit-Felder auslesen kann!
Dachte da an sowas wie:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| procedure datasetP.ReadIn; var i,Code: Integer; begin for i:=1 to 23 do begin Val(Form1.Edit????.Text,Parameter[i],Code); if Code <>0 then ShowMessage('Falsche Eingabe des Paramters '+ IntToStr(i)); end; end; |
Paramter[i] ist hierbei an array[0..25]!
Oder muss ich doch alle einzeln einlesen!
Schöne Grüße
der Endanwender
Moderiert von raziel: Delphi-Tags hinzugefügt.
|
|
alzaimar
      
Beiträge: 2889
Erhaltene Danke: 13
W2000, XP
D6E, BDS2006A, DevExpress
|
Verfasst: Mi 25.05.05 20:50
Mit der Voigtfunktion kenn ich mich nicht aus. Aber mit Delphi:
Du setzt die 'Tag' Eigenschaft (Tag: engl. in etwa "Etikett") jedes Editfeldes auf einen eindeutigen Wert. Also, z.B. Edit1.Tag := 1, Edit2.Tag := 2 usw...
Wenn Du dann Durch die Components iterierst, kannst Du einfach folgendes machen:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| ... For i:=0 to ComponentCount - 1 do If Components[i] is TEdit Then Begin ParamIndex := TEdit(Components[i]).Tag; If ParamIndex > 0 Then Parameter[ParamIndex] := TEdit(Components[i]).Text; End; |
Diese Tag-Property ist eigentlich die am meisten unterschätzte Eigenschaft aller Komponenten. Man kann damit Pointer mitschleppen, Komponenten indizieren etc. Praktische Sache.
Wie gesagt, wenn Du eine Funktion hast, kann ich Dir die Parameter mit nonlinearer Regression ausrechnen...
|
|
|