WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Syms,Werte einsetzten

 

phigo90
Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 22.01.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.02.2016, 19:43     Titel: Syms,Werte einsetzten
  Antworten mit Zitat      
Folgende Problematik:

Bisheriger Code:

Code:
%
function[Df]=calcAbl(x,nfunc,p2,scale);
syms z;
for i=1:nfunc;
    fi(i)=exp(-((z-p2(i+2*nfunc))/p2(i+nfunc)).^2);
end
f2=sum(fi);
for i=1:nfunc;
    f3(i)=scale*p2(i)*fi(i)/f2;
end
syms G(z);
G(z)=sum(f3);
DG(z)=diff(G,z);
g=matlabFunction(DG);
for i=1:length(x);
    Df(i)=g(x(i));
end
 


Ich habe mir eine Funktion geschrieben, welche mir die Ableitung berechnet. Meine Funktion setzt sich aus einer Summe von Gaussfunktionen (genormed) zusammen. Das hat soweit auch alles funktioniert. p2 ist dabei ein Vektor, welcher die Vorfaktoren, die Mittelwerte sowie die Varianzen enthält. Diese Funktion wird in einer Schleife aufgerufen (welche zum Beispiel von 1 bis 44 läuft, dabei ist p2 immer unterschiedlich). Natürlich ist das sehr ineffizient diese Ableitung immer wieder zu bilden. Für eine große Anzahl von Funktionen wird dadurch mein Programm sehr langsam.
Nun wollte ich allgemein die Ableitung einmal bilden. Dabei möchte ich den Vektor p2 Variabel lassen. Des Weiteren ist die FunktionenAnzahl Variabel.
Beispiel: nfunc=3 dann bestitz p2 neun Einträge. 3 Vorfaktoren, 3 Varianzen und 3 Mittelwerte. Für nfunc=5 sind es 15 Einträge usw...

Was ich bisher versucht habe, aber nicht funktionirt bzw. ich nicht zum Laufen bekomme:
Ich definiere mir zuerst global 3*nfunc symsVariablen und rufe anschließend die Funktion calcAblAllg auf.
Code:
%
Vari=sym('aa',[1 3*nfuncapp])
Dg=calcAblAllg(nfuncapp,Vari)

function[DG]=calcAblAllg(nfunc,p2);
syms z;
for i=1:nfunc;
    fi(i)=exp(-((z-p2(i+2*nfunc))/p2(i+nfunc)).^2);
end
f2=sum(fi);
for i=1:nfunc;
    f3(i)=p2(end)*p2(i)*fi(i)/f2;
end
% syms G(z);
G(z,p2)=sum(f3);
DG(z,p2)=diff(G,z);
 


Diese gibt mir jetzt DG zurück. Das ist eine symfun welche von z und von a1,a2,a3 usw. abhängt. Nun möchte ich beim Schleifendurchlauf die Variablen a1,a2,a3 usw. mit Werte ersetzten (Diese Werte habe ich in einem Vektor gespeichert). Das bedeutet im Endeffekt ist das ganze nur noch eine Funktion von z. Dann setzte ich Werte für z ein und Werte meine Ableitung an gewählten Stellen aus.
für nfunc=9
Mein Problem: DG(z,a1,a2,a3....,a9)=...
Nun habe ich einen Vektor p3=[1 2 3 4 5 6 7 8 9].Ich möchte diesen Vektor p3 nun in DG einsetzen, sodass DG(z,1,2,3,4,5,6,7,8,9) und im Anschluß daran die Funktion an vorgegebenen z Werte auswerten.
Hat hier jemand einen Tipp wie ich das effizient umsetzen kann. Ich benötige dies für meine Masterarbeit und hatte keine Matlabschulung oder ähnliches, deswegen ist vllt. meine Vorgehensweise auch total kompliziert. Nochmal in ein paar Stichworten was ich machen möchte:

1) Global die Ableitung bilden einer Summe von Gaussfunktionen (Variable z,a1,a2,a3 usw.)
2) In einer Schleife den Werte a1,a2,a3 usw. definierte Werte zuweisen, welche in einem Vektor stehen
3) Auswerten der Funktion an vorgebenen z Werten. Mein Code läuft wenn ich den Abschnitt "bisheriger Code" benutze, aber da hier in jedem Durchlauf die Ableitung neu gebildet wird (dieser Schritt ist total ineffizient, da wenn man Variablen benutzt sich die Ableitung ja nicht ändert, lediglich für unterschiedliche Werte für a1,a2,a3 kommen dann unterschiedliche Ableitungen raus). Problematisch wird es wenn ich die zweite Ableitung berechne, dann nimmt das in der Laufzeit Ausmaße an, welche nicht mehr aktzeptabel sind. Deshalb möchte ich die Berechnung der Ableitung/2.Ableitung global durchführen und in der Schleife lediglich für die Variablen Werte einsetzen.

Ich hoffe ich konnte meine Problemstellung gut genug erklären und bedanke mich schon einmal für jegliche Hilfe.
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden


Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2024 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.