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

Problem mit Eval Funktion

 

Paprika_25
Forum-Anfänger

Forum-Anfänger


Beiträge: 15
Anmeldedatum: 04.07.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.07.2011, 11:41     Titel: Problem mit Eval Funktion
  Antworten mit Zitat      
Hallo goMatlab-Community,

ich habe ein Programm in Matlab welches mir die Schnittpunkte von zwei Kreisen errechnen soll.
Dabei ist ein Kreis fest und der andere bewegt sicher wiederum auf einer Kreisbahn um ein anderes Zentrum.

Nach einem ersten Durchlauf der Schleife meldet Matlab den Fehler:
??? In an assignment A(I) = B, the number of elements in B and
I must be the same.

Error in ==> Test at 81
eval([ 'A_' num2str(m) '1']) = [x1; M_2(2); z1];

Kann man num2str(k) evtl. nur einmal in einer Schleife verwenden oder wo ist hier mein Fehler?

Danke für eure Hilfe Smile

Code:
for k = 1:9
   
    fprintf('\nKreis um B%d auf Ring mit step = %d\n', k, step);
   
    syms x z
   
    B = eval(['B_' num2str(k)]);

    % Kreisgleichungen:

    eq1 = '(x - B(1))^2 + (z - B(3))^2 = length_tri23^2';
    eq2 = '(x - M_2(1))^2 + (z - M_2(3))^2 = r_2^2';
    unbekannt = 'x, z';

    erg = solve(eq1, eq2, unbekannt);

    % Vereinfachung der Gleichungen:

    x1 = simplify (erg.x(1));
    x2 = simplify (erg.x(2));
    z1 = simplify (erg.z(1));
    z2 = simplify (erg.z(2));

%     % Gleichungen ausgeben:
%    
%     fprintf('%s \n',char(x1));
%     fprintf('%s \n',char(x2));
%     fprintf('%s \n',char(z1));
%     fprintf('%s \n',char(z2));

    % Einsetzen der Variablen in die Gleichungen:

    x1 = subs (x1, {'B', 'M_2', 'length_tri23', 'r_2'}, {B, M_2, length_tri23, r_2});
    x2 = subs (x2, {'B', 'M_2', 'length_tri23', 'r_2'}, {B, M_2, length_tri23, r_2});
    z1 = subs (z1, {'B', 'M_2', 'length_tri23', 'r_2'}, {B, M_2, length_tri23, r_2});
    z2 = subs (z2, {'B', 'M_2', 'length_tri23', 'r_2'}, {B, M_2, length_tri23, r_2});

    fprintf('\n x1 = %g \n',x1);
    fprintf(' x2 = %g \n',x2);
    fprintf(' z1 = %g \n',z1);
    fprintf(' z2 = %g \n',z2);
   
    %  Nur ein Schnittpunkt:

    if ( x1 == x2 && z1 == z2)
       
        eval([ 'A_' num2str(k)]) = [x1; M_2(2); z1];

    else % Zwei Schnitpunkte
       
        eval([ 'A_' num2str(k) '1']) = [x1; M_2(2); z1];
        eval([ 'A_' num2str(k) '2']) = [x1; M_2(2); z1];

    end
   
end
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: 04.07.2011, 12:41     Titel:
  Antworten mit Zitat      
Hallo,

das Problem ist, dass du einen mehrelementigen Vektor in eine Komponente eines (vermutlich) Double-Arrays zu schreiben versuchst.

Generell rate ich dazu, EVAL zu vermeiden, eben weil es zu solchen relativ schwierig zu identifizierenden Problemen kommen kann.

Zudem dürfte die EVAL-Anweisung in dieser Form sowieso nicht funktionieren, weil da in der Regel der gesamte Befehl rein muss. Wenn schon, dann müsste man wohl ASSIGNIN verwenden.

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

Moderator


Beiträge: 537
Anmeldedatum: 08.12.10
Wohnort: ---
Version: 7.10, 2010a
     Beitrag Verfasst am: 04.07.2011, 13:14     Titel:
  Antworten mit Zitat      
Hallo,
wie Harald schon sagt, ist von eval eher abzuraten.

Anstatt
Zitat:
Code:

eval([ 'A_' num2str(k) '2']) = [x1; M_2(2); z1];
 

Kannst du mit cell arrays arbeiten:
Code:

A{k, 2} = [x1; M_2(2); z1];
 

_________________

Gruß
Peter
_________________
goMatlab-Knigge - dran gehalten?!
Schon in den FAQ gesucht? Oder der MATLAB Hilfe?
Ist vielleicht bei den Skripten oder den Tutorials was für dich dabei?
Private Nachricht senden Benutzer-Profile anzeigen
 
Paprika_25
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 15
Anmeldedatum: 04.07.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.07.2011, 13:57     Titel:
  Antworten mit Zitat      
Okay danke erstmal für eure Hilfe!
Das mit den eval-Funktion hat jetzt funktioniert, musste nur die komplette Zeile in die Funktion schrieben.

Jetzt versuche ich das gerade mit den Cell-Arrays:

Ich habe nun meine Punkte entlang der Kreisbahn in eine Cell gepackt:

Code:
B_1 = [M_3(1); M_3(2); (M_3(3) + r_3)];
B_2 = [(M_3(1) + r_3 * cos(22.5)); M_3(2); (M_3(3) + r_3 * sin(22.5))];
B_3 = [(M_3(1) + r_3 * cos(45)); M_3(2); (M_3(3) + r_3 * sin(45))];
B_4 = [(M_3(1) + r_3 * cos(67.5)); M_3(2); (M_3(3) + r_3 * sin(67.5))];
B_5 = [(M_3(1) - r_3); M_3(2); M_3(3)];
B_6 = [(M_3(1) + r_3 * cos(112.5)); M_3(2); (M_3(3) + r_3 * sin(112.5))];
B_7 = [(M_3(1) + r_3 * cos(135)); M_3(2); (M_3(3) + r_3 * sin(135))];
B_8 = [(M_3(1) + r_3 * cos(157.5)); M_3(2); (M_3(3) + r_3 * sin(157.5))];
B_9 = [M_3(1); M_3(2); (M_3(3) - r_3)];

B_cell (:,1) = {B_1, B_2, B_3, B_4, B_5 B_6, B_7, B_8, B_9};


diese rufe ich nun in meiner for-Schleife so auf:

Code:
B = B_cell (k, 1);


Allerdings kommt bei der Zeile

Code:
x1 = subs (x1, {'B', 'M_2', 'length_tri23', 'r_2'}, {B, M_2, length_tri23, r_2});


der Fehler ??? Error using ==> mupadmex
Cell input must have string contents.

Was kann man da machen?
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: 04.07.2011, 14:12     Titel:
  Antworten mit Zitat      
Hallo,

subs funktioniert nur bei symbolischen Ausdrücken.

Sind M_3, r_3 etc. symbolische Variablen??

Achte auch darauf: sin und cos arbeiten in MATLAB mit dem Bogenmaß, d.h. du willst wahrscheinlich cos(pi/4) statt cos(45). Alternative ist die Verwendung von sind, cosd etc.

Und was sind x1, M_2, r_2 ...?

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 15
Anmeldedatum: 04.07.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.07.2011, 14:47     Titel:
  Antworten mit Zitat      
Danke für den Hinweis mit sin und cos....hatte ich total vergessen Embarassed

M_2/3, r_2/3, length_tri23 sind feste geometrische Variblen die ich zur Lösung der Kreisgleichung benötige, kann man diese dann in subs so einsetzen?

x1/2 & z1/2 sind dann die beiden Schnittpunkte der Kreise, also das was ich suche.

Das ganze Problem muss aber irgendwie an dem Cell-Array liegen, denn wenn ich
Code:
B = eval(['B_' num2str(k)]);

verwende funktioniert subs...
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: 04.07.2011, 14:55     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
M_2/3, r_2/3, length_tri23 sind feste geometrische Variblen die ich zur Lösung der Kreisgleichung benötige, kann man diese dann in subs so einsetzen?

Können ja, aber ich sehe keinen Grund dazu, das nicht als "ganz normale" Konstanten zu definieren.

Zitat:
x1/2 & z1/2 sind dann die beiden Schnittpunkte der Kreise, also das was ich suche.

Ich hätte das vielleicht klarer ausdrücken sollen. Was ist der Datentyp von x1?

Solange nicht mal der Zusammenhang zwischen x1 und B, M_2,... klar ist, wird es schwierig sein, dir weiterzuhelfen.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 15
Anmeldedatum: 04.07.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.07.2011, 15:21     Titel:
  Antworten mit Zitat      
x1/2 und z1/2 sind 1x1 double-Werte, also einfach Koordinaten eines Punktes....

Mit der Funktion subs bezwecke ich das einsetzen der ganzen Variablen in die Gleichungen die ich mit

Code:

eq1 = '(x - B(1))^2 + (z - B(3))^2 = length_tri23^2';
eq2 = '(x - M_2(1))^2 + (z - M_2(3))^2 = r_2^2';
unbekannt = 'x, z';

erg = solve(eq1, eq2, unbekannt);

x1 = simplify (erg.x(1));
x2 = simplify (erg.x(2));
z1 = simplify (erg.z(1));
z2 = simplify (erg.z(2));


erhalten habe. Denn dabei handelt es sich ja um symbolische Gleichungen die nur aus den "Namen" der Variablen bestehen und nichts berechnen.
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.