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

Schleife bauen

 

demar
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 56
Anmeldedatum: 18.03.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.11.2009, 12:14     Titel: Schleife bauen
  Antworten mit Zitat      
Morgen!!!
ich habe ein Problem, das in etwa so klingst :

Ich habe eine Funktion
,
Code:


x(i) = d/2 * abs(cos(theta(i))).^(2/n11);
y(i) = -h * abs(sintheta(i)).^(2/n21);

 

die als blaue Kurve in etwa so aussieht( schau Bild an).

Ich brauche eine Schleife, das die blaue Kurve so verändert, das die zur grüne wird und des roten Punkt dann schneidet. "n11" und "n21" sind die Steigungen dieser Funktion.Die muß man so verändern, dass diese grüne Kurve entsteht.

Meine Idee war so:Ich hab einen fest gegeben Punkt und lasse aus meine Funktion einen Punkt ausgeben beim gleichen y-Wert.

Code:

px=2.1;
py=-1;

y3 =interp1(y,abs(x),-1,'nearest')
 


Jetzt muß ich Matlab irgendwie sagen, dass osweit px>y3 ist verändere n11 und n21 solange bis px=y3 ist.

Könnte mir jemand helfen.Ich danke schon mal im voraus!!!

Alex

Grafik1.jpg
 Beschreibung:

Download
 Dateiname:  Grafik1.jpg
 Dateigröße:  44.13 KB
 Heruntergeladen:  487 mal
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


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

so ein Problem hatten wir ja schon mal, aber dieses Mal ist es doch deutlich verständlicher.

Wenn ich das richtig sehe, kannst du allein durch Variation von n11 sämtliche Abläufe abdecken? Die Frage wäre lediglich, wie "schnell" die Kurve durchlaufen wird.

Also... du willst, dass ein Punkt (x0, y0) durchlaufen wird. Für welches theta bzw. i? oder ist das egal...

Insbesondere bei geg. theta ist das für mich ein Optimierungsproblem:

Minimiere Abstand zwischen [x(n11, n21, theta), y(n11, n21, theta)] und (x0, y0)

Wenn es ansonsten keine Einschränkungen gibt, bietet sich fminunc zur Minimum-Suche an.

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

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 56
Anmeldedatum: 18.03.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.11.2009, 21:21     Titel:
  Antworten mit Zitat      
Hallo Harald..

das theta oder i ist eigentlich egal. Es soll ja quasi so ablaufen:

Die Kurve wird erstellt und prüft ob der Punkt (px,py) auf der Kurve ist, wenn nicht verändere n11 und n21 solange, bis y3=px ist. py ist egal weiö es fest ist. Ich habe das mit schleifen versucht aber das klappt alles nicht.Verzweifle schon seit Tagen an dieses Problem!!!Kannst du mir vielleicht helfen. Das wäre echt super!!

Gruß Alex
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.500
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 02.11.2009, 23:36     Titel:
  Antworten mit Zitat      
Hallo,

sorry wenn ich so frage, aber: hast du meinen Post eigentlich ganz gelesen? Wie gesagt: ich würde es als Optimierungsproblem auffassen, und zu seiner Lösung fminunc verwenden.

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

Forum-Meister


Beiträge: 24.500
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 03.11.2009, 10:28     Titel:
  Antworten mit Zitat      
P.S.: Eine einfachere Lösung wäre natürlich, das so zu sehen:

xp = d/2 * abs(cos(theta)).^(2/n11);
yp = -h * abs(sin(theta(i))).^(2/n21);

Wenn alles außer n11 und n21 fest ist, kann man das unter Anwendung von Logarithmusgesetzen sogar explizit von Hand lösen.

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

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 56
Anmeldedatum: 18.03.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.11.2009, 17:01     Titel:
  Antworten mit Zitat      
Ich habe mich glaube ich falsch ausgedrückt. Das i und theta sind laufende Variablen.Schau Quelcode:
Code:


px=3;                  % x-Wert an dem die Kurve verändert wird

y3 =interp1(y,abs(x),-1,'nearest');



n= 100;                   % Stützstellen
theta = (0:1:n)/n*pi;
theta(n+1)=pi; sintheta = sin(theta); sintheta(1) = 0; sintheta(n+1) = 0;

for i=1:n+1
    if theta(i) <= pi/2
       while  d_LD1 > px
               
               n11=i
               n12=i
               x_ga(i) = d/2 * abs(cos(theta(i))).^(2/n11);
               y_ga(i) = -h * abs(sin(theta(i))).^(2/n21);
               y3=interp1(y,abs(x),-1,'nearest');
               y3 == px ;  
     
        break    
        end    
   end
end

 


So weit bin ich gekommen. Klappt aber leider nicht so, weil n11 und n21 gegen i gehen.wie kann ich denn schreiben, dass n11 und n21 stoppt, wenn y3=px ist? Ich muß sagen, dass ich nen Anfänger in Matlab bin und dadurch alles mir sehr schwer fällt!!

Danke Alex
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

wenn du Probleme mit dem Programmieren hast, ist es vielleicht besser, wenn du deine Aufgabe in (klaren) Worten beschreibst.

Probleme im Code:
    In der while-Schleife werden weder d_LD1 noch px verändert. Das wird also entweder nie ausgeführt, oder führt zu einer Endlosschleife.
    Wozu berechnest du x_ga und y_ga, wenn du sie später nicht verwendest?

    x und y werden dagegen verwendet, aber nie berechnet.

    y3 == px liefert true / false zurück, wird aber nicht weiter verwendet.

Mir ist klar, dass theta bzw. i Vektoren (oder wie du sagtest: laufende Variablen sind). Nur wird es so sein, dass du theta fest wählen musst, wenn du zu einem eindeutigen n11, n21 kommen willst. Ansonsten bekommst du für jedes n11, n21 ein anderes theta.

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

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 56
Anmeldedatum: 18.03.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.11.2009, 20:05     Titel:
  Antworten mit Zitat      
Ohh sorry.Hat damit zutun, dass ich jedes mal wenn ich was reinstelle, versuche es so einfach wie möglich rein zu stellen und dadurch verändere ich immer die Namen der Variablen.So müßte es richtig heißen:
Code:


px=3;                  % x-Wert an dem die Kurve verändert wird

y3 =interp1(y,abs(x),-1,'nearest');

n= 100;                   % Stützstellen
theta = (0:1:n)/n*pi;
theta(n+1)=pi; sintheta = sin(theta); sintheta(1) = 0; sintheta(n+1) = 0;

for i=1:n+1
    if theta(i) <= pi/2
       while  px > y3
               
               n11=i
               n12=i
               x(i) = d/2 * abs(cos(theta(i))).^(2/n11);
               y(i) = -h * abs(sin(theta(i))).^(2/n21);
               y3=interp1(y,abs(x),-1,'nearest');
               y3 == px ;  
     
        break    
        end    
   end
end
 



Danke für deine Mühe Harald!!
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.500
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 03.11.2009, 21:33     Titel:
  Antworten mit Zitat      
Ja, der Code ist jetzt stimmiger, aber was du letztlich damit erreichen willst, ist mir immer noch nicht klar.

Insbesondere: was ist mit n11 und n21?

Und wenn man dir helfen soll, wäre es schon gut, auf alle Fragen / Einwände einzugehen, insbesondere:

Code:
Nur wird es so sein, dass du theta fest wählen musst, wenn du zu einem eindeutigen n11, n21 kommen willst. Ansonsten bekommst du für jedes n11, n21 ein anderes theta.

(bzw. umgekehrt: für jedes theta eine andere Kombination n11, n21)

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

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 56
Anmeldedatum: 18.03.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.11.2009, 11:28     Titel:
  Antworten mit Zitat      
hi...

Wie soll ich den theta festlegen?Wenn ich das mache, dann würde das bedeuten, dass ich nur einen einzigen Punkt irgendwo bei zum Beispiel theta=pi bekomme und keine Kurve mehr. Oder habe ich dich jetzt falsch verstanden!!

Gruß Alex
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.500
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 05.11.2009, 11:37     Titel:
  Antworten mit Zitat      
Hallo,

das theta würde ich fest legen (z.B. auf pi/4), um das n11 und n21 für den einen Punkt zu bestimmen. Danach würde ich theta wieder variabel gestalten, um die Kurve zu bekommen.

Wenn du einen Datensatz von d und h hast, und welcher Punkt auf der Kurve liegen soll, kann ich dir das auch mal zeigen, sofern das bis jetzt nicht klar geworden ist.

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

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 56
Anmeldedatum: 18.03.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.11.2009, 12:01     Titel:
  Antworten mit Zitat      
ok...
mit den ganzen Werten müßtest du jetzt was anfangen können:
Code:


function [xx,yy] = semiellipse(n11,n21)
n11=2;                %fürs erste fest gesetzt
n21=2;                % fürs erste fest gesetzt
h=3.5;                 % Höhe der der Kurve
d=8;                    % doppelte Breite der Kurve
n= 100;               % Stützstellen

px=4.3;                  % x-Wert an dem die Kurve verändert wird
py=-1;                 % y-Wert an dem die Kurve verändert wird

theta = (0:1:n)/n*pi;
theta(n+1)=pi; sintheta = sin(theta); sintheta(1) = 0; sintheta(n+1) = 0;


for i=1:n+1
    if theta(i) <= pi/2                              
               x(i) = d/2 * abs(cos(theta(i))).^(2/n11);
               y(i) = -h * abs(sin(theta(i))).^(2/n21);          
   end
end
y3 =interp1(y,abs(x),-1,'nearest');

for i=1:n+1
    if theta(i) <= pi/2
       while  px > y3
               
               n11=i
               n12=i
               x(i) = d/2 * abs(cos(theta(i))).^(2/n11);
               y(i) = -h * abs(sin(theta(i))).^(2/n21);
               y3=interp1(y,abs(x),-1,'nearest');
               y3 == px ;  
     
        break    
        end    
   end
end

if nargout == 0
    plot(x,y,px,py,'o')
    xlabel('x','FontSize',16)
    ylabel('z','FontSize',16)
    axis equal
else
    xx = x; yy = y;
end

 


Das ist eben nur ein kleiner Teil meines Quellcodes, aber aber es müßte sofort funktionieren, wenn du es kopierst!!

Gruß Alex
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.500
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 05.11.2009, 12:36     Titel:
  Antworten mit Zitat      
Hi,

der Ansatz, den ich wählen würde:

Code:
h=3.5;                 % Höhe der der Kurve
d=8;                    % doppelte Breite der Kurve

px=3.4;                  % x-Wert an dem die Kurve verändert wird
py=-1;                 % y-Wert an dem die Kurve verändert wird

theta = pi/4;

n11 = 2 / (log(px / (d/2)) / log(abs(cos(theta))));
n21 = 2 / (log(py / (-h)) / log(abs(sin(theta))));

theta = linspace(0, pi/2, 200);
x = d/2 * abs(cos(theta)).^(2/n11);
y = -h * abs(sin(theta)).^(2/n21);
plot(x, y, 'b-', px, py, 'bo')


px = 4.3 ist > d/2, erscheint mir nicht sinnvoll, deswegen px = 3.4 genommen.

Man sieht: der Punkt liegt auf der Kurve. Die Kurve sieht allerdings nicht so aus wie in deinem Bild. Ausserdem bekommst du eine andere Kurve, wenn du theta anders wählst.

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

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 56
Anmeldedatum: 18.03.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.11.2009, 13:09     Titel:
  Antworten mit Zitat      
Ich danke dir ganz doll für deine Mühe Harald!!!
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.