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

Excel -> Matlab, Gleichungssystem lösen

 

kaktus018

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.07.2015, 10:36     Titel: Excel -> Matlab, Gleichungssystem lösen
  Antworten mit Zitat      
Hallo,

ich habe ein spezielles Problem in Excel, bei welchem ich ein Gleichungssystem in VBA erzeuge und ausgebe. Es ist im Grunde zwar linear, aber die Gleichungen haben eine "unschöne" Form. D.h. es wäre ein großer Aufwand das ganze umzuformen und mittels Koeffizientenmatrix und Störvektor zu lösen.
Deswegen wollte ich mal den Spreadsheet Link von Matlab nutzen und das GLS mit Matlab lösen. Leider finde ich kaum brauchbare Dokumentation darüber. Ich kann jetzt z.B. die Gleichungen als Matrix an Matlab übergeben, allerdings werden diese als String erkannt und ich kann folglich keine Funktion darauf anwenden.
Weiß jemand, ob es eine entsprechende Seite oder Literatur gibt, die genau dieses Problem behandelt oder kann mir vielleicht so helfen?

Vielen Dank schon einmal für Antworten!


Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 05.07.2015, 11:10     Titel:
  Antworten mit Zitat      
ohne beispiel daten und code ist es sehr schwer vorschläge zu machen.
es gibt zb die funktion str2func oder auch matlabFunction . für konkretere vorschläge bräuche man dann schon auch beispiel. sihe am besten auch den thread aus meiner signatur dazu
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
kaktus018

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.07.2015, 11:40     Titel:
  Antworten mit Zitat      
Die originalen Gleichungen haben dann z.B. die Form:
Code:
1000*(6.12303176911189E-17*(0)-1*(1))-210000000*(0.666666666666667*(1*(u2-0)+0*(0-0))+0.00013)*(1*(1-0)+0*(0-0))-210000000*(0.554700196225229*(0.832050294337844*(0-u2)+0.554700196225229*(0-0))-0)*(0.832050294337844*(0-1)+0.554700196225229*(0-0))==0


Zu Testzwecken verwende ich aber die Excel-Datei im Anhang (eventuell geht hier der Verweis auf das Excel Add-In von Matlab verloren, falls das jemand auf seinem PC öffnen möchte). Der Code steht im Modul1.
D.h. ich versuche mich mal am System
a+b+c==5
a-5-c==0
6*b+3.5*a==2.32
Dieses kann ich mit Mlputmatrix() an Matlab übergeben, aber wie gesagt nur als String. In Matlab stehen die Gleichungen dann in der Matrix var und die Variablen in sys.
Code:
Sub Test()
        Dim sys As Range, var As Range
        Set sys = Tabelle1.Range("A1:A3")
        Set var = Tabelle1.Range("B1:B3")
        mlputmatrix "sys", sys
        mlputmatrix "var", var
End Sub
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 05.07.2015, 11:44     Titel:
  Antworten mit Zitat      
hmm also lauffähige beispiele sind immer besser. damit man damit arbeiten kann. sihe am besten auch den thread aus meiner signatur.
Code:
syms u2
a='1000*(6.12303176911189E-17*(0)-1*(1))-210000000*(0.666666666666667*(1*(u2-0)+0*(0-0))+0.00013)*(1*(1-0)+0*(0-0))-210000000*(0.554700196225229*(0.832050294337844*(0-u2)+0.554700196225229*(0-0))-0)*(0.832050294337844*(0-1)+0.554700196225229*(0-0))==0';
sol=solve(a)

so kann man zb dein "originalen Gleichungen" lösen.
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
kaktus018

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.07.2015, 12:33     Titel:
  Antworten mit Zitat      
Ich habe leider nichts lauffähiges Sad
Im Anhang habe ich nochmal 2 Bilder um mein (vorläufig erstes) Problem zu beschreiben.
Beim ersten Bild habe ich die Gleichungen direkt in die Konsole geschrieben und die Lösung funktioniert problemlos. Beim zweiten Bild schreibe ich die Gleichung über Excel in den Workspace von Matlab. Das sind dann aber offenbar Strings mit denen Matlab nichts anfangen kann.

2.jpg
 Beschreibung:

Download
 Dateiname:  2.jpg
 Dateigröße:  44.88 KB
 Heruntergeladen:  420 mal
1.jpg
 Beschreibung:

Download
 Dateiname:  1.jpg
 Dateigröße:  22.92 KB
 Heruntergeladen:  497 mal
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 05.07.2015, 12:42     Titel:
  Antworten mit Zitat      
dann musst du wohl noch ein bisschen nachbearbeitung bei sys machen. wenn du die variable in matlab hast sollte es kein problem sein code zu posten der die variable erstellt. oder von mir aus auch die variable hochzuladen.
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

warum stellst du denn den Code als Screenshot und nicht als Code zur Verfügung? Damit man das ausführen kann, was du zeigst, muss man sich mühsam den Code zusammenstückeln.

Code:
sys = {'a+b+c==5';
'a-5-c==0';
'6*b+3.5*a==2.32 '};
loesung = solve(sys{:});
loesung.a
loesung.b
loesung.c


Falls sys kein Cell Array von Strings ist wie in meinem Beispiel, müsstest du sagen, was es ist.

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

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.07.2015, 13:38     Titel:
  Antworten mit Zitat      
Ok, mit sys({:}) funktioniert es. Sys ist vom Typ "Cell", von Hand eingegeben (also nicht mit Strings) ist die Matrix vom Typ "Sym", da liegt das Problem.
Was genau macht {:}? Habe nicht viel Ahnung von Matlab Rolling Eyes
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 05.07.2015, 13:42     Titel:
  Antworten mit Zitat      
kaktus018 hat Folgendes geschrieben:
Was genau macht {:}? Habe nicht viel Ahnung von Matlab Rolling Eyes

kann man in der doc nachlesen ( nach : suchen)
http://de.mathworks.com/help/matlab/ref/colon.html
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
kaktus018

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.07.2015, 14:11     Titel:
  Antworten mit Zitat      
Ok, vielen Dank!
Jetzt habe ich die Lösung im Vektor Loesung, welcher vom Typ "Struct" ist. Wie bekomme ich jetzt die Lösung zurück in den Excel Workspace?
In VBA habe ich zum Lesen ja die Funktionen MLGetMatrix und MLGetVar zur Verfügung, aber wie kann ich diese auf "Loesung" anwenden, bzw. was muss ich mit "Loesung" in Matlab noch machen, damit die Werte übergeben werden?
Folgendes liefert z.B. "NONEXIST!" zurück:
Code:
Sub test()
        Dim sys As Range
        Dim MatLab As Object
        Dim Data As Variant
       
        Set MatLab = CreateObject("Matlab.Application")
        Set sys = Tabelle1.Range("A1:A3")
        Call MatLab.Execute("clear")
        mlputmatrix "sys", sys
        Call MatLab.Execute("lsg=solve(sys{:})")
       
        MLGetVar "lsg.a", Data
        MsgBox Data
End Sub


Wenn ich das noch hinbekomme, wäre ich wunschlos glücklich Very Happy
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.492
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 05.07.2015, 15:20     Titel:
  Antworten mit Zitat      
Hallo,

es gibt ja auch keine Variable lsg.a. Da wäre es doch naheliegend, lsg.a in eine Variable zu schreiben und diese dann zurückzuholen?

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

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.07.2015, 16:23     Titel:
  Antworten mit Zitat      
Ok, ich bin jetzt fast schon am Ziel.
Folgender VBA-Code gibt mir die Lösung in das Tabellenblatt aus:
Code:
Sub test()
        Dim sys As Range
        Dim MatLab As Object
        Dim Data As Variant
       
        Set MatLab = CreateObject("Matlab.Application")
        Set sys = Tabelle1.Range("A1:A3")
        Call MatLab.Execute("clear")
        mlputmatrix "sys", sys
        Call MatLab.Execute("lsg=solve(sys{:})")
        Call MatLab.Execute("lsg=[lsg.a;lsg.b;lsg.c]")
        Call MatLab.Execute("lsg=double(lsg)")

        mlgetmatrix "lsg", Tabelle1.Range("I1").Address
        MatLabRequest
End Sub

Jetzt sollte das ganze auch dynamisch funktionieren, d.h ich möchte auf die Elemente der Structure "lsg" in der Form "lsg(i)" zugreifen können und dabei
1) den Feldnamen (im Beispiel für lsg.a -> Name = "a") und
2) den Wert der Variablen zurückgegeben bekommen.

Könntet ihr mir hierbei noch helfen?
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 05.07.2015, 16:31     Titel:
  Antworten mit Zitat      
kenn mich damit nicht aus aber kannst du nicht ne matlab funktion schreiben die das macht? for schleife und fieldnames
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
kaktus018

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.07.2015, 16:46     Titel:
  Antworten mit Zitat      
Gibt es in Matlab keinen direkten Weg per Index auf die einzelnen Felder zuzugreifen?
Z.B.
lsg.a hat den Wert 1.5

lsg(1) gibt "1.5"
lsg(1).fieldname gibt "a"
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.492
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 05.07.2015, 17:14     Titel:
  Antworten mit Zitat      
Hallo,

eine Möglichkeit wäre eine MATLAB-seitige Umwandlung in ein Cell Array mit struct2cell

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite 1, 2  Weiter

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.