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

Variable von Wertebereich anderer Variable abhängig machen

 

Backfisch
Forum-Anfänger

Forum-Anfänger


Beiträge: 11
Anmeldedatum: 28.01.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.03.2015, 12:27     Titel: Variable von Wertebereich anderer Variable abhängig machen
  Antworten mit Zitat      
Hallo zusammen,

ich befinde mich noch immer auf dem (noch jungen) Weg der Erleuchtung zu einem besseren Matlabprogrammierer und bin dabei auf die nächste unüberwindbare Hürde gestoßen. Durch die Suchefunktion konnte ich im Forum und auch per Google leider kein anschauliches Beispiel für mein Problem finden.
Es geht darum, dass ich eine Grafik plotten möchte, bei der sich eine Variable abhängig von den Werten einer anderen ändert. Ich habe versucht, dies über eine if-Schleife zu lösen, wobei ich mir nicht mal sicher bin, ob das der richtige Weg ist. Der Code sieht folgendermaßen aus und gibt auch einen Plot aus:
Code:

close all;
clc;

distance_step = 1e-6;              

C0 = 20;                            
L = 1e-4;                          
 
x = 0:distance_step:L;              
t = [50,100,200,1000];              
c = zeros(length(x),length(t));    

if x <= 2e-5
    D = 1e-10;
    if 2e-5 < x <= 7e-5
        D = 3e-11;
        if x > 7e-5
            D = 5e-11;
        end
    end
end

for index_x=1:1:length(x)          
    for index_t=1:1:length(t)
        total = 0;
        for n=1:1:200
            total = total + (-2*C0/(n*pi)) * exp(-D*t(index_t)*(n*pi/L)^2) * sin(n*pi*x(index_x)/L);
        end
        c(index_x, index_t) = C0*(1-x(index_x)/L) + total;
    end
end

figure(1);
plot(x,c,'linewidth',2);
ylim([0 20]);
grid on;
 

Allerdings sollten sich die angezeigten Linien zu den in der if-Schleife angegebenen x-Werten aufgrund der neuen Werte für D relativ schlagartig ändern, was sie nicht tun.
Ich hoffe, die Frage ist gut verständlich und nicht zu simpel. Für Tipps wäre ich sehr dankbar!

Viele Grüße,

Backfisch
Private Nachricht senden Benutzer-Profile anzeigen


Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 24.03.2015, 13:45     Titel:
  Antworten mit Zitat      
Zitat:
Code:
if x <= 2e-5
    D = 1e-10;
    if 2e-5 < x <= 7e-5
        D = 3e-11;
        if x > 7e-5
            D = 5e-11;
        end
    end
end

x ist bei dir ein vektor und keine einzelne zahl. ich denke also nicht das der angegebene code das macht was du willst. das kann man schnell mit dem debugger überprüfen. bei der benutzung von length ist darauf zu achten das immer dei größte dimension ausgegeben wird. das spiel bei dir keine rolle aber kann zu problemem bei anderen dingen führen. ich würde immer size mit entsprechender dimensionsangabe benutzen. außerdem denke ich das man deine forschleifen auch vektorisieren kann.
Zitat:
wobei ich mir nicht mal sicher bin, ob das der richtige Weg ist.
ohne genau zu wissen was du als egebniss haben willst ist das schwer zu entscheiden.
meinst du sowas?
Code:
distance_step = 1e-6;              

C0 = 20;                            
L = 1e-4;                          
 
x = 0:distance_step:L;              
t = [50,100,200,1000];              
c = zeros(length(x),length(t));    
D=x;
D(x>7e-5)=5e-11;
D(x<=2e-5)=1e-10;
D(x>2e-5 & x<=7e-5)=3e-11;

_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
Backfisch
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 11
Anmeldedatum: 28.01.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.03.2015, 14:36     Titel:
  Antworten mit Zitat      
Hallo Winkow,

erstmal danke für die schnelle Antwort! Der Vorschlag von dir ist genau das, was ich meinte. D soll bei bestimmten Wertebereichen von x einen bestimmten Wert annehmen. Mein Problem ist nun, dass sich in Zeile 24 ("c(index_x, index_t) = C0*(1-x(index_x)/L) + total;")
Code:
close all;
clc;

distance_step = 1e-6;              

C0 = 20;                            
L = 1e-4;                          
 
x = 0:distance_step:L;              
t = [50,100,200,1000];              
c = zeros(length(x),length(t));    

D=x;
D(x<=2e-5)=1e-10;
D(x>2e-5 & x<=7e-5)=3e-11;
D(x>7e-5)=5e-11;

for index_x=1:1:length(x)          
    for index_t=1:1:length(t)
        total = 0;
        for n=1:1:200
            total = total + (-2*C0/(n*pi)) * exp(-D*t(index_t)*(n*pi/L)^2) * sin(n*pi*x(index_x)/L);
        end
        c(index_x, index_t) = C0*(1-x(index_x)/L) + total;
    end
end

figure(1);
plot(x,c,'linewidth',2);
ylim([0 20]);
grid on;
 
der Fehler "Subscripted assignment dimension mismatch." eingeschlichen hat. Was habe ich mir darunter vorzustellen? Ich konnte zwar recherchieren, das vermutlich mehr Werte eingespeichert werden sollen, als im Array vorhanden sind, aber wo der Fehler genau liegt, weiß ich leider nicht. Auch der Debugger hat mir dort nicht weitergeholfen. Für Ideen wäre ich sehr dankbar und hoffe, dass die Fragen nicht zu aufdringlich sind.

Viele Grüße,

Backfisch
Private Nachricht senden Benutzer-Profile anzeigen
 
Knygs
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 58
Anmeldedatum: 26.03.15
Wohnort: ---
Version: 2015b, 2017a, 2021a
     Beitrag Verfasst am: 27.03.2015, 14:46     Titel:
  Antworten mit Zitat      
Hi Backfisch,
hier mal meine Lösung.
Ich glaube, du willst beim Durchlaufen der Schleife immer beim entsprechenden x ein passendes D haben.
mit

Zitat:

Code:

if x <= 2e-5
    D = 1e-10;
    if 2e-5 < x <= 7e-5
        D = 3e-11;
        if x > 7e-5
            D = 5e-11;
        end
    end
end

kann das aber nicht funktionieren. Du frägst hier ab, ob x kleiner gleich einem Wert ist und innerhalb der Abfrage, in die Matlab nur springt, wenn es wahr ist, frägst du noch einmal ab ob x größer als der zuvor abgefragte Wert ist. Das ist ein Widerspruch und kann gar nicht funktionieren. Wenn dann müsstest du es noch mit elseif machen, aber dann hast du dadurch, dass x ein Vektor ist trotzdem nicht wirklich ein klares Ergebnis, da alle Werte in x vorkommen, du aber nur ein D hast.

Probiers mal damit. Da spanne ich einen Vektor D enstprechend deinem Vektor x auf und nehme in der Schleife dann genau wie bei x die einzelnen Elemente in D zum Berechnen her.
[/quote]
Code:

distance_step = 1e-6;              

C0 = 20;                            
L = 1e-4;                          
 
x = 0:distance_step:L;              
t = [50,100,200,1000];              
c = zeros(length(x),length(t));    

% if x <= 2e-5
%     D = 1e-10;
% elseif 2e-5 < x <= 7e-5
%         D = 3e-11;
% elseif x > 7e-5
%             D = 5e-11;
% end

[dummy1 dummy2]=find(x <= 2e-5);
D(dummy2(1):dummy2(end))=1e-10;
[dummy3 dummy4]=find(x > 7e-5);
D(dummy2(end)+1:dummy4(1)-1)=3e-11;
D(dummy4(1):dummy4(end))=5e-11;


for index_x=1:1:length(x)          
    for index_t=1:1:length(t)
        total = 0;
        for n=1:1:200
            total = total + (-2*C0/(n*pi)) * exp(-D(index_x)*t(index_t)*(n*pi/L)^2) * sin(n*pi*x(index_x)/L);
        end
        c(index_x, index_t) = C0*(1-x(index_x)/L) + total;
    end
end

figure(1);
plot(x,c,'linewidth',2);
ylim([0 20]);
grid on;
hold on;


der "Subscripted assignment dimension mismatch" von oben kommt dadurch zustande, dass du nun für D einen Vektor hast und deswegen in der Berechnung auch wieder einen Vektor bekommst, obwohl du nur einen Skalar brauchst. d.h. du musst, wie ich oben bereits beschrieben habe, genauso wie bei x(index_x) in der schleife auch D(index_x) benutzen.

vg

Edit: wobei Winkow das Aufspannen von D deutlich eleganter macht als ich ;-)
Private Nachricht senden Benutzer-Profile anzeigen
 
Backfisch
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 11
Anmeldedatum: 28.01.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.03.2015, 12:49     Titel:
  Antworten mit Zitat      
Hallo Knygs,

vielen Dank für deine Antwort! Ich habe deinen Code mal übernommen und im Prinzip ist es genau das, was ich brauchte Wink. Ich schaue, dass ich das, was du geschrieben hast, noch verstehe. Danach wird noch etwas Feintuning meinerseits nötig sein, bis alles passt, aber das bekomme ich hoffentlich alleine hin Laughing .

Viele Grüße,

Backfisch

PS: Das Forum ist wirklich der Hammer!
Private Nachricht senden Benutzer-Profile anzeigen
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 30.03.2015, 15:31     Titel:
  Antworten mit Zitat      
man kann die innere schleife auch sehr leicht ersetzen
Code:
distance_step = 1e-6;              

C0 = 20;                            
L = 1e-4;                          
 
x = 0:distance_step:L;              
t = [50,100,200,1000];              
c = zeros(length(x),length(t));    
D=ones(size(x))*3e-11;
D(x>7e-5)=5e-11;
D(x<=2e-5)=1e-10;
n=1:1:200 ;
for index_x=1:length(x);          
for index_t=1:length(t);          
c(index_x,index_t)=C0*(1-x(index_x)/L)+sum((-2*C0./(n*pi)).*exp(-D(index_x)*t(index_t).*(n*pi/L).^2).*sin(n*pi*x(index_x)/L));
end    
end

figure(1);
plot(x,c,'linewidth',2);
ylim([0 20]);
grid on;
hold on;

ich bin mir fast sicher das man die äußeren auch ersetzen kann. hab aber grade keine zeit mehr Smile
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
Backfisch
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 11
Anmeldedatum: 28.01.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 31.03.2015, 11:32     Titel:
  Antworten mit Zitat      
Hallo Winkow,

vielen Dank für deine Optimierung des Codes! Jetzt muss ich zwar wieder neue Befehle nachschlagen, aber das kann mir nur von Nutzen sein Smile . Jede Schleife weniger kommt mir auf jeden Fall entgegen.

Viele Grüße,

Backfisch
Private Nachricht senden Benutzer-Profile anzeigen
 
Backfisch
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 11
Anmeldedatum: 28.01.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.04.2015, 13:53     Titel:
  Antworten mit Zitat      
Hallo Leute,

ich muss das Thema leider nochmal öffnen, da sich etwas Neues ergeben hat.
Jetzt funktioniert zwar der Code, doch es hat sich herausgestellt, dass die Hauptformel nicht ganz richtig ist. Bei
Code:
c(index_x,index_t)=C0*(1-x(index_x)/L)+sum((-2*C0./(n*pi)).*exp(-D(index_x)*t(index_t).*(n*pi/L).^2).*sin(n*pi*x(index_x)/L));
muss das
Code:
(-2*C0./(n*pi)
eigentlich als Faktor vor der Summenfunktion stehen und nicht innerhalb davon. Ich habe erstmal versucht, den entsprechenden Teil einfach vor die Summe zu ziehen, wonach sich Matlab wieder mal mit "Subscripted Assignment Mismatch" gemeldet hat. Ihr hattet mir den Grund dieses Fehlers ja schon genannt, doch ich kann beim besten Willen nicht entdecken, wo der Wurm drin ist. Zusätzlich stelle ich mir gerade die Frage, ob das Summenzeichen überhaupt notwendig ist, da es sich danach ja um ein Produkt handelt, in dem n sowieso schon über den Code
Code:
n=1:1:200 ;
zugewiesen wird. Vielleicht kann mir jemand nochmal erklären, wann ich Punkte vor mathematische Operatoren setzten muss, da die Matlabhilfe da für mich keine Klarheit schafft. Sorry, falls ich nerve, doch so kurz vor dem Ende nicht weiterzukommen macht mich fertig Confused .

Viele Grüße,

Backfisch
Private Nachricht senden Benutzer-Profile anzeigen
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 01.04.2015, 14:26     Titel:
  Antworten mit Zitat      
Zitat:
vielleicht kann mir jemand nochmal erklären, wann ich Punkte vor mathematische Operatoren setzten muss, da die Matlabhilfe da für mich keine Klarheit schafft.

aus der matlab doc:
Zitat:
C = A.*B multiplies arrays A and B element by element and returns the result in C.

was genau daran ist nicht ganz klar ?

Zitat:
Ich habe erstmal versucht, den entsprechenden Teil einfach vor die Summe zu ziehen, wonach sich Matlab wieder mal mit "Subscripted Assignment Mismatch" gemeldet hat.

ja du versuchst ja auch einem ein element eintrag ein 200 elemente vektor zuzusweisen. das geht natürlich nicht.
wie du das machen musst kann ich dir nicht sagen da sich die berechnun natürlich dann total von der obrigen unterscheidet. da müsste ich raten.
welches n willst du denn mit der summe über 200 n multiplizieren? das macht keinen sinn auf den ersten blick
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
Backfisch
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 11
Anmeldedatum: 28.01.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.04.2015, 12:35     Titel:
  Antworten mit Zitat      
Hallo Winkow,

erstmal vielen Dank, dass du dich noch meinen Fragen stellst Wink. An der Hilfe zu den Punkten vor den Operatoren verstehe ich nicht, wie sich die Aktion von einem Operator ohne Punkt unterscheidet. Wird beim Operator ohne Punkt nur der letzte, bzw. nur ein Wert ausgegeben/gespeichert? Dann wäre die Frage beantwortet Smile. Zu der Formel lade ich gleich am besten ein Foto hoch, da ich die mit dem Formeleditor Erstellte hier nicht einfügen kann. Dann sieht man auf einen Blick, wie die Formel eigentlich sein sollte.

Viele Grüße,

Backfisch
Private Nachricht senden Benutzer-Profile anzeigen
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 07.04.2015, 12:45     Titel:
  Antworten mit Zitat      
Backfisch hat Folgendes geschrieben:
Wird beim Operator ohne Punkt nur der letzte, bzw. nur ein Wert ausgegeben/gespeichert?

das eine ist times das andere mtimes
Zitat:
C = A*B is the matrix product of A and B. If A is an m-by-p and B is a p-by-n matrix, then C is an m-by-n matrix defined by...

wenn du unter times in der doc guckst ist unten unter see also mtimes
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
Backfisch
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 11
Anmeldedatum: 28.01.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.04.2015, 10:31     Titel:
  Antworten mit Zitat      
Hallo Winkow,

danke für den Hinweis. Ich werde mich wohl erst nochmal eingehend mit Matrizenrechnung beschäftigen müssen, bevor ich eine Lösung zum Thema finde. Deine Tipps werden dabei auf jeden Fall sehr hilfreich sein, danke!
Ich schließe das Thema also vorerst und wende mich nochmal vertrauensvoll ans Forum, wenn sich was neues ergibt Wink.

Viele Grüße,

Backfisch
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.