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

Schnittkoordinaten von Geraden

 

harry999
Forum-Anfänger

Forum-Anfänger


Beiträge: 24
Anmeldedatum: 04.09.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.09.2009, 14:05     Titel: Schnittkoordinaten von Geraden
  Antworten mit Zitat      
Gegeben sind Geraden die in einem Interpolationsintervall definiert sind, d.h es existieren Geraden die zwischen den Stützpunkten x0 und x1, x1 und x2 etc. definiert sind.Nun Kommen weitere Geraden hinzu, diese sind zwischen anderen Stützpunkten definiert zB. zwischen x0 und x4, zwischen x1 und x5...usw.

Es sollen alle Schnittkoordinaten der Geraden, die zB im Interpolationsintervall x0 und x4 definiert sind mit den Geraden die im Interpolationsintervall x0 und x1, x1 und x2, x2 und x3, x3 und x4 definiert sind, berechnet werden.

Für die Schnittkoordinate x und y gilt: sx= bk+(-1)*bi/(mi+(-1)*mk) und sy= mi*sx +bi

Man kann die Geraden die nicht fest in den Stützpunkten x0 und x1, x1 und x2 usw. je nachdem welche Schrittweitte k man wählt durch die Schtützpunkte mit k=3 durch die Stützpunkte x0 und x4, x1 und x5 darstellen!

In der Folgenden Datei habe ich schon mal ide Darstellung des Problems in einem Plot und die benötigten Geraden implementiert!

Komme leider alleine nicht mehr weiter Sad

Schönen Gruß

Schnittgeraden.m
 Beschreibung:

Download
 Dateiname:  Schnittgeraden.m
 Dateigröße:  1.52 KB
 Heruntergeladen:  990 mal
Private Nachricht senden Benutzer-Profile anzeigen


harry999
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 24
Anmeldedatum: 04.09.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.09.2009, 16:16     Titel:
  Antworten mit Zitat      
ich denke man sollte die einzelnen Geraden zuerst so definieren das sie nur in ihrem Interpolationintervall definiert sind.

Aber wie man das macht, weiss ich auch nicht Sad

das wäre schon mal eine große Hilfe, für mich
Private Nachricht senden Benutzer-Profile anzeigen
 
Thomas84

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.09.2009, 07:43     Titel: geraden
  Antworten mit Zitat      
ich würde zuerst die Schnittpunkte berechnen und dann überprüfen ob sich der Schnittpunkt in dem Interval liegt in dem die Geraden definiert sind. Das geht in Matlab z.B. so

x = x*(x>untere_grenze)*(x<obere_grenze);

Ich hab dein Programm mal so erweitert das es das tut. Ist allerdings nicht sehr schön geschrieben. Da kannst du sicher noch was optimieren.


Code:

clc
clear all %Programm-Vermaschung Teil 1
%Stützstellen
x=[0:20];
%Stützwerte
y=[1 2 1 1 2 1 4 2 2 1 -1 2 3 2 2 2 1 -2 2 -1 2]';
%Anzahl der Stützstellen
n=20;
M=zeros(n,1);
B=zeros(n,1);
%k ist die Schrittweite der Iterations-Geraden
k=10;
z=n-k+1;
Mk=zeros(z ,1);
Bk=zeros(z ,1);
%lineare Interpolation zwischen zwei Stützpunkten
%es wird mit dieser Interpolation die Gerade y=mx+b erstellt
%m ist die Steigung und b ist der Schnittpunkt mit der y-Achse
%Diese Gerade ist nur zwischen zwei Stützpunkten definiert
%Sie gibt den funktionalen Zusammenhang zwischen diesen zwei Stützpunkten

for i=1:n
    %Berechnung von m
    m=(y(i+1)-y(i))/(x(i+1)-x(i));
    %Berechnung von
    b=y(i)+m*-x(i);
    M(i,1)=m; B(i,1)=b;
end

%lineare Interpolation der Iterations-Geraden
%diese Gerade geht durch k+1 Stützpunkte
%Diese Gerade ist nur in ihrem Interpolationsintervall definiert

for l=1:z
    %Berechnung von mk
    mk=(y(l+k)-y(l))/(x(l+k)-x(l));
    %Berechnung von   k
    bk=y(l)+mk*-x(l);
    Mk(l,1)=mk; Bk(l,1)=bk;
end

M
B
Mk
Bk

%Schnittkoordinaten
xschnitt = [];
yschnitt = [];

for l = 1:z
    % Schnittpunkte berechnen
    xs = (B-Bk(l))./(Mk(l) -M);
    xh = xs - cumsum(ones(size(xs))) +1;
    % Lage der Schnittpunkte überprüfen
    xs = xs(find((xh>0).*(xh<1).*(xs>x(l)).*(xs<x(l+k)) ));
    ys = Mk(l)*xs + Bk(l);
    xschnitt = [xschnitt;xs];
    yschnitt = [yschnitt;ys];
end
   

%Polygonflächen
%Grafik des Profils mit Iterations-Geraden
plot(x,y,'ro-','linewidth',2,'Markersize',6,'Markerfacecolor','r'); hold on;
for i=1:z
    X =[x(i) x(i+k)];
    Y =[y(i) y(i+k)];
    plot(X,Y);
end
grid on;zoom on;

%Schnittpunkte anzeigen
plot(xschnitt,yschnitt,'g+');

hold off;
 
 
harry999
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 24
Anmeldedatum: 04.09.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.09.2009, 23:07     Titel: Polygonflächen
  Antworten mit Zitat      
Vielen Dank!

Ich bin leider noch der totale anfänger....wie kann ich den jetzt auf die Schnittpunkte zugreiffen?Ausgeben konnte ich sie,es waren genau die richtigen Very Happy .

Das Ziel meines Programms: ist es die Fläche der von den Iterations-Geraden Eingeschlossenen Polygone zu berechnen. Zu jeder Iterations-Geraden mit k>=2 gibt es eine Polygonflächen (ist abhängig von den Stützwerten. Diese sollen für jeweis eine Iterations-Gerade summiert werden.

z.B
für k=4 haben wir zwei Polygone
1.Polygon mit den Ecken P1(0;1), P2(1,6;1,4),P3(1;2)
2.Polygon mit den Ecken P1(1,6;1,4),P2(2;1),P3(3;1),P4(4;2)
Die Fläche dieser beiden Polygone soll addiert werden.
-Das wäre das Ergebniss der ersten Iterations-Geraden

Die Fläche eines Polygons wird nach der Gaußschen Trapetzformel berechnet http://de.wikipedia.org/wiki/Gau%C3%9Fsche_Trapezformel

Komm echt nicht weiter, habe es mit anderen Sprachen versucht, hab auch keine richtige Idee, wie ich dieses Problem angehen kann....

Aber ich bin schon viel weiter, habe schon die Schnittpunkte Very Happy [/b]
Private Nachricht senden Benutzer-Profile anzeigen
 
Thomas84

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.09.2009, 08:35     Titel: re
  Antworten mit Zitat      
ich würde mir da das Leben nicht so schwer machen. Wenn ich es richtig verstanden habe ist die Summe der Flächeninhalte der Polygone einfach die Fläche zwischen der Iterrationsgerade und der Interpolationsfunktion. D.h. man kann diese Fläche durch Integration bestimmen.

Das geht mit Matlab ziemlich einfach (siehe code), hab allerdings nicht getestet ob das Ergebnis wirklich richtig ist

Code:

clc
clear all %Programm-Vermaschung Teil 1
%Stützstellen
n=20;
x=(0:n)';
%Stützwerte
y=[1 2 1 1 2 1 4 2 2 1 -1 2 3 2 2 2 1 -2 2 -1 2]';

%k ist die Schrittweite der Iterations-Geraden
k=4;
z = n-k+1;
A = zeros(1,z);

for l=1:z
    %Berechnung von mk
    mk=(y(l+k)-y(l))/(x(l+k)-x(l));
    %Berechnung von   k
    bk=y(l)+mk*-x(l);
   
    % Betrag(Interpolationsgerdade - Iterationsgerade )
    f = abs(y(l:l+k) - polyval([mk,bk],x(l:l+k)));
   
    % Integral von f
    A(l) = trapz(f);
end

A
 
 
harry999
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 24
Anmeldedatum: 04.09.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.09.2009, 11:57     Titel: Fehler
  Antworten mit Zitat      
irgendwie läuft das Programm bei mir nicht, Matlab zeigt mir einen Fehler an bei f=abs(y(l:l+k)-polyval([mk,bk],x(l:l+k)));

da steht:
Error using minus
Matrix dimensions must agree.
Private Nachricht senden Benutzer-Profile anzeigen
 
Thomas84

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.09.2009, 12:15     Titel: re
  Antworten mit Zitat      
hm, bei mir funktioniert es. Die Matrixdimension kann man mit dem Befehl size ermitteln. Du must wahrscheinlich einen der beiden Vektoren transponieren d.h. zu bsp y(l:l+k) durch y(l:l+k)' ersetzen.
 
harry999
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 24
Anmeldedatum: 04.09.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.09.2009, 15:18     Titel: es läuft
  Antworten mit Zitat      
Es läuft und zeigt sogar die richtigen Ergebnisse....war außerdem ein guter Tipp es mit Integrallen zu versuchen, ist nicht so aufwendig wie ich es mit Polygonen versuchen wollte.So hätte ich viel zeit sparen können Sad

wie gibt er mir den alle Ergebnisse, in einem Spalten-Vektor aus?
Private Nachricht senden Benutzer-Profile anzeigen
 
Thomas84

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.09.2009, 06:18     Titel: transponieren
  Antworten mit Zitat      
Eine Matrix transponiert man wie gesagt mit dem Operator ' . Der macht dann aus einem Zeilenvektor einen Spaltenvektor und umgekehrt. Du kannst aber auch A gleich richtig Initiallisieren. ( A = ones(z,1) )
 
harry999
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 24
Anmeldedatum: 04.09.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.09.2009, 17:11     Titel:
  Antworten mit Zitat      
Vielen Dank,
jetzt klappt alles wunderbar Very Happy
Private Nachricht senden Benutzer-Profile anzeigen
 
harry999
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 24
Anmeldedatum: 04.09.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.09.2009, 03:21     Titel:
  Antworten mit Zitat      
eine frage habe ich allerdings noch, was ist wenn ich die Iterationsgerade als regressionsgerade haben will...wie muss ich den dan programmieren....muss ich den befehl polyval irgendwie ändern...oder gibt es für die Regressionsgerade kein befehl. Hab es gegoogelt, nur leider hab ich nichts gefunden.
Private Nachricht senden Benutzer-Profile anzeigen
 
Thomas84

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.09.2009, 07:08     Titel: Regressionsgerade
  Antworten mit Zitat      
Um die Regressionsgerade zu bestimmen kann man polyfit verwenden. Die Funktion gibt die gesuchten Koeffizienten des Polynoms aus. D.h. man muss f einfach durch
Code:

f = abs(y(l:l+k) - polyval(polyfit(x(l:l+k),y(l:l+k),1),x(l:l+k)));
 

ersetzen.
 
harry999
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 24
Anmeldedatum: 04.09.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.09.2009, 00:59     Titel: Fehler bei der Berechnung in Matlab
  Antworten mit Zitat      
ich führe die Berechnung mit folgendem code durch:

Code:

clc
clear all

%Stützstellen
n=20;
x=(0:n)';

%Stützwerte
y=[5   5 5 5 5 5 5   -5 -5   -5 -5   -5 -5   -5 5 5 5 5 5 5 5]';

%k ist die Schrittweite
for k=2:n
 
    Flaeche=0;
    A = zeros(1,1);

 for l=1:n-k+1
   
       % Betrag(Interpolationsgerade - "Regressions_Iterationsgerade" )
       f = abs(y(l:l+k) - polyval(polyfit(x(l:l+k),y(l:l+k),1),x(l:l+k)));
 
   
       % Integral von f
       A(l,1) = trapz(f);
   
       end
   
    %Summe der einzelnen Flächen
    Flaeche = Flaeche + sum(A)
   
    A
   end

 


mit k=20 wird über alle Stützwerte eine Regressionsgerade gelegt.

ich habe mal die Berechnung mit dieser Schrittweite in Excel durchgeführtd, die Gradengleichung für diese Regressionsgerade ist übrigens y=0,66666667.

Die Geradengleichungen für die Interpolationsgeraden sind:

m b
0 10
0 10
0 10
0 10
0 10
0 10
-10 70
0 0
0 0
0 0
0 0
0 0
0 0
10 -130
0 10
0 10
0 10
0 10
0 10
0 10



Die Zwischenflächen der interpolationsgeraden und der "Regressions_Iterationsgerade" betragen,pro Segment :

3,333333333
3,333333333
3,333333333
3,333333333
3,333333333
3,333333333
1,666666667
6,666666667
6,666666667
6,666666667
6,666666667
6,666666667
6,666666667
1,666666667
3,333333333
3,333333333
3,333333333
3,333333333
3,333333333
3,333333333

Die Summe daraus ist:=83,3333333333333

In Matlab erhalte ich allerdings eine falsche Summe....sie beträgt in Matlab 90.

Woran liegt das, bzw was mache ich falsch?
Die Berechnung der zwischenflächen passt!
Private Nachricht senden Benutzer-Profile anzeigen
 
Thomas84

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.09.2009, 08:38     Titel: re
  Antworten mit Zitat      
also Matlab bekommt als Regressionsgerade g = 1.667 + 0*x heraus. Das passt auch besser da 1,6667 gerade der Mittelwert der y-Werte ist.
Außerdem passen die Werte für die Interpolationsgeraden nicht. Die Gerade f = 10, geht doch nicht durch die Punkte P(x,5).

Was ist den das Ziel dieser ganzen Berechnungen? Ich kann mir unter der berechneten Fläche gar nicht vorstellen.
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.09.2009, 13:13     Titel: re
  Antworten mit Zitat      
Hallo,
Sie haben Recht, ich Danke Ihnen für den Hinweis.
Jetzt klappt die Berechnung der Fläche mit der Regressionsgeraden.

Ziel:Die Fläche dient als Fehlerfaktor,desto mehr Gesamtfläche, desto schlechter das Potential....ist etwas komplizierter, dieser Algorithmus ist nur 1% des Geasmtprojekts.

Ein anderer Fehlerfaktor wäre der Abstand der Stützpunkte zu der Regressionsgeraden.

ich bin leider raus aus der programmierung Sad
 
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 - 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.