Verfasst am: 17.09.2009, 13:05
Titel: Schnittkoordinaten von Geraden
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!
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
das wäre schon mal eine große Hilfe, für mich
Thomas84
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 22.09.2009, 06:43
Titel: geraden
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 clearall %Programm-Vermaschung Teil 1
%Stützstellen
x=[0:20];
%Stützwerte
y=[1211214221-1232221-22-12]';
%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;
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 .
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
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 [/b]
Thomas84
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 23.09.2009, 07:35
Titel: re
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 clearall %Programm-Vermaschung Teil 1
%Stützstellen
n=20;
x=(0:n)';
%Stützwerte
y=[1211214221-1232221-22-12]';
%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)));
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.
Thomas84
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 23.09.2009, 11:15
Titel: re
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.
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
wie gibt er mir den alle Ergebnisse, in einem Spalten-Vektor aus?
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) )
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.
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
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!
Thomas84
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 28.09.2009, 07:38
Titel: re
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: ---
Verfasst am: 28.09.2009, 12:13
Titel: re
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
Einstellungen und Berechtigungen
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
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.