% Wir wollen die Kettenlinie bestimmen, und zwar durch eine Messung % und durch die Lösung einer Differentialgleichung. Außerdem soll % die Messung mit dem theoretisch erwarteten Ergebnis verglichen % werden. % % Zuerst lesen wir die Daten einer gemessene Kette ein. Die Kette % wurde vor den Bildschirm geklebt und mit der Funktion mouse() % wurden die Bildpunkte abgenommen. >P=getmatrix(24,2,"kette.dat")'; % Wir geben die Messpunkte und die verbundene Kurve aus. >xplot(P[1],P[2]); >style("m[]"); hold on; mark(P[1],P[2]); hold off; wait(); % Versuchen wir zunächst, eine Parabel mit diesen Punkten in Übereinstimmung % zu bringen. >p=polyfit(P[1],P[2],2); >y=polyval(p,P[1]); >hold on; color(3); plot(P[1],y); color(1); hold off; wait(); % Die Zeichnung zeigt, daß die Übereinstimmung nicht groß ist. % % Versuchen wir es mit einer physikalischen Überlegung und einer % aus kleinen Teilen zusammengesetzten Kette. Dazu dient die Überlegung, % daß die y-Kompente der Zugkraft in der Kette im gleichen Verhältnis % mit der Kettenlänge zunimmt. >ky=-1:0.01:1; kx=ones(size(ky)); % Die Kette geht in Richtung der Kraft und setzt sich aus lauter % kleinen gleich langen Teilstücken zusammen. Sie hat die Gesamtlänge % 1. >ds=sqrt(kx*kx+ky*ky)*100; >X=0|cumsum(kx/ds); Y=0|cumsum(ky/ds); % Wir normieren noch so, daß die Kette im Ursprung am tiefsten % hängt. >X=X-(X[1]+X[cols(X)])/2; Y=Y-min(Y); >xplot(X,Y); wait(); % Nun bestimmen wir eine cosh-Kurve, die die obige Kurve interpoliert, % und zeichnen den Fehler. >a=bisect("x*cosh(X[1]/x)-x-Y[1]",1,1000) >y1=a*cosh(X/a)-a; >max(abs(Y-y1)) % Wie man sieht, ist der Fehler verschwindend gering. % % Versuchen wir nun, eine Funktion vom Typ a*cosh((x-b)/c)-d an % die gemessene Funktion anzupassen. Der Faktor a/c ist der Verzerrungsfaktor % des Bildschirms bei der Messung. % % Zunächst wird die Funktion jedoch neu gezeichnet. >xplot(P[1],P[2]); >style("m[]"); hold on; mark(P[1],P[2]); hold off; wait(); % Anschließend programmiert man die zu minimierende Funktion. >function f(x) $global P; $y=x[1]*cosh((P[1]-x[2])/x[3])-x[4]; $return sum((y-P[2])^2); $endfunction % Das Minimum wird mit der Methode von Nelder berechnet. >x=neldermin("f",[1,0,1,1],eps=0.0001); % Dies ergibt eine zufriedenstellende Übereinstimmung. >hold on; color(3); plot(P[1],x[1]*cosh((P[1]-x[2])/x[3])-x[4]); color(1); hold off; wait(); >