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

Probleme mit subs()

 

Jetty

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.09.2012, 14:43     Titel: Probleme mit subs()
  Antworten mit Zitat      
Hallo!

ich versuche in eine symbolische Funktion Werte einzugeben und bin auf ein Problem gestoßen. ich habe eine multidimensionale Funktion g erstellt.
Code:

syms x1 x2 x3 x4 x5 x6
g(x1, x2, x3, x4, x5, x6) =
 
         x1^2 + x3^2
      (2*x2^3)/5 + 1
       - x5^2/2 + x3
 (3*x4^4)/2 - x3^2/2
      3*x5 - x1 + x6
              3*x6^3
 

und möchte jetzt für x1-x6 Werte einsetzen. Ein Aufruf mit g(1,1,1,1,1,1) funktioniert, aber führt leider zu symbolischen Ergebnissen und -was noch wichtiger ist - ist unglaublich langsam, weswegen double(g(1,1,1,1,1,1)) auch nicht helfen würde.

ich habe jetzt also nach numerisch arbeitenden Befehlen gesucht und "subs()" gefunden/benutzt. Aber er ersetzt mir nur 5 Variablen fehlerfrei und beschwert sich, wenn ich alle 6 einfüge:
Code:

   subs(g,[x1,x2,x3,x4,x5],[1, 1, 1, 1, 1])
 
ans(x1, x2, x3, x4, x5, x6) =
 
      2
    7/5
    1/2
      1
 x6 + 2
 3*x6^3
-----------------------------------------------------------------
subs(g,[x1,x2,x3,x4,x5,x6],[1, 1, 1, 1, 1, 1])
Undefined function 'formula' for input arguments of type 'double'.

Error in symfun (line 37)
            y = y@sym(formula(x));

Error in sym/subs (line 121)
        G = symfun(G,argnames(F));
 

Was mache ich falsch?


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 27.09.2012, 16:42     Titel:
  Antworten mit Zitat      
Hallo,

mein Vorschlag:

Code:
syms x1 x2 x3 x4 x5 x6
g = [x1^2 + x3^2
      (2*x2^3)/5 + 1
       - x5^2/2 + x3
 (3*x4^4)/2 - x3^2/2
      3*x5 - x1 + x6
              3*x6^3 ]

subs(g,[x1,x2,x3,x4,x5,x6],[1, 1, 1, 1, 1,1])


Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Jetty

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.09.2012, 11:09     Titel:
  Antworten mit Zitat      
Danke Harald,

es funktioniert, aber leider ist es auch nicht schneller.
Ich hab diese Zeile auch über eine ausgelagerte Funktion programmiert:
[code ]
function [ Funktionswert ] = fwertr6( x )
Funktionswert = [x(1)^2+x(3)^2; 0.4*x(2)^3+1; x(3)-0.5*x(5)^2; 1.5*x(4)^4-0.5*x(3)^2; 3*x(5)-x(1)+x(6); 3*x(6)^3];
[/code]
und diese ist bis zu 1000x schneller als subs()
[code]
%Funktion
Elapsed time is 0.000022 seconds.
Elapsed time is 0.000022 seconds.
Elapsed time is 0.000021 seconds.
%subs()
Elapsed time is 0.020067 seconds.
Elapsed time is 0.018501 seconds.
Elapsed time is 0.019304 seconds.
[code]
Leider ist das unglaublich undynamisch. Gäbe es noch einen relativ schnellen dynamischen Ansatz um das Problem zu lösen?
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 28.09.2012, 12:40     Titel:
  Antworten mit Zitat      
Hallo,

was genau heißt hier "undynamisch" bzw. "dynamisch"?

Ich persönlich würde für solche Zwecke Function Handles verwenden:
Code:
g = @(x) [x(1)^2+x(3)^2; 0.4*x(2)^3+1; x(3)-0.5*x(5)^2; 1.5*x(4)^4-0.5*x(3)^2; 3*x(5)-x(1)+x(6); 3*x(6)^3];


Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
coJetty
Forum-Newbie

Forum-Newbie


Beiträge: 2
Anmeldedatum: 28.09.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.09.2012, 13:23     Titel:
  Antworten mit Zitat      
Hi,

mit undynamisch meine ich, dass der Benutzer die fwertr6 Datei umschreiben muss um eine andere Funktion durchzurechnen. Ich fände es schön, wenn man die Funktion mit einem Parameter g, der eine symbolische Funktion ist, aufrufen könnte.

Wenn ich ein funktionshandle benutze, kann ich leider nicht mehr den jacobian(g) Befehl benutzen, den ich an einer andere Stelle im Programm benötige.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 28.09.2012, 13:54     Titel:
  Antworten mit Zitat      
Hallo,

wenn der Nutzer eine andere Funktion verwenden möchte, wird es ihm doch nicht erspart bleiben, an irgendeiner Stelle diese Funktion anzugeben?

Wenn du dir die zusätzliche Datei sparen möchtest, hier noch ein Vorschlag: zunächst wie bisher mit der symbolischen Funktion arbeiten und, statt wiederholt einzusetzen, daraus ein Function Handle erzeugen:
Code:


Das dauert zwar einmalig 0,1 Sekunden, aber man kann eben nicht alles haben (schnelles Einsetzen einerseits und symbolische Berechnungen über jacobian o.ä. andererseits).

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
coJetty
Forum-Newbie

Forum-Newbie


Beiträge: 2
Anmeldedatum: 28.09.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.10.2012, 11:13     Titel:
  Antworten mit Zitat      
Hi,

Also deine neue Lösung funktioniert wirklich gut. Sie ist relativ schnell, hat aber von dir erwähnte längere Anlaufphase, was aber O.K. ist. Also vielen Dank nochmal, du warst eine große Hilfe!
Private Nachricht senden Benutzer-Profile anzeigen
 
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 - 2025 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.