Ich hab die Aufgabe bekommen folgendes Problem zu lösen:
Zitat:
Zum Mähen einer kreisfö̈rmigen Rasenflä̈che soll ein Schaf eingesetzt werden. Das Schaf wird mit einer Schnur an einem Pfahl festgebunden, der am Rand der Wiese steht. Schreiben Sie ein MATLAB-Programm zur Berechnung, wie lang die Schnur sein muss, damit das Schaf die Hä̈lfte der Flä̈che der Wiese mähen kann!
Das hab ich so gelöst, dass ich eine Matrix mit den Abstandswerten vom Ausgangspunkt gefüllt habe und nacher gesucht habe, ab welchem Wert mind. 50% der Matrix vertreten sind.
Code:
size=[1000;500]% größe der abfragematrix
schaf=[300;1]% position des schafes
W=zeros(size(2,1),size(1,1));
for ix=1:size(1,1),
for iy=1:size(2,1),
W(iy,ix)=sqrt((ix-schaf(1,1))^2+(iy-schaf(2,1))^2); % r = sqrt ( (x-xm)^2 + (y-ym)^2 ) end end
for a=0:max(size),
teil=sum(sum(W<=a));
if(teil>=1/2*size(2,1)*size(1,1))
printf('50%% oekogerecht gemaeht bei einer Schnurlaenge von %i Feldern', a-1); break;
end end
Das löst zwar das Problem, aber der Code ist äußerst ineffizient. Kann mir von euch einer sagen wie ich entweder das Füllen oder das Abfragen effizienter machen kann? - beim Abfragen hatte ich schon eine andere Möglichkeit (so dass sum nicht so oft angewandt wird), aber das war noch langsamer.
Leider benutze ich mein Matlab gerade selbst, daher kann ich es nicht ausprobieren.
Es sollte aber folgendes funktionieren (zumindest für das erstellen der Matrix W):
Code:
groesse = [1000;500];
schaf = [300;1]
W = zeros(groesse(2,1),groesse(1,1));
ix = (1:groesse(1,1));
ix = repmat(ix,groesse(2,1),1); % erstelle eine Matrix der Groesse von W, deren Zeilen alle die Werte 1 bis groesse(2,1) enthalten
iy = (1:groesse(2,1))';
iy = repmat(iy,1,groesse(1,1)); % analog zu ix, nur wird die Matrix aus Aneinanderreihung der Spalten erzeugt
W = sqrt((ix-schaf(1,1)).^2 + (iy-schaf(2,1)).^2); % die Schafposition wird von den Indizes subtrahiert, danach werden die beiden Matrizen jeweils elementweise quadriert, die Matrizen werden addiert, und elementweise wird die Wurzel gezogen.
Ich glaube für dieses Problem habe ich schon irgendwo eine analytische Lösung gesehen. Man musste nur ein (fieses?) Integral lösen...
_________________
Danke, der Code funktioniert einwandfrei (und wirklich schnell verglichen zu meinem!)
repmat hab ich noch nie verwendet, aber damit scheint man Schleifen ja recht einfach umgehen zu können.
Und ich denk ich hab jetzt eine Idee wie ichs weiter optimieren kann, ich werds da posten sobald ich Zeit hab mich damit zu beschäftigen.
edit:
@nschlange: das Problem ließe sich sicher auch mit iterativen Integralen lösen, die dürften gar nicht mal so schwer sein... aber daran hab ich zuerst gar nicht gedacht, werd mir das am Wochenende mal genauer anschauen.
Ich erinnere mich dunkel, zu Vordiplomszeiten mal einige Tage damit in der Mensa verbracht zu haben. Damals gab es noch kein google oder wiki, sondern altavista und Freunde. Wir haben uns damals darauf geeinigt, dass es analytisch nicht lösbar ist. Fall jemand eine Lösung findet, würde ich mich sehr freuen wenn mir jemand den Link schicken oder posten könnte!
_________________
---------------------------------------------------------------
Leider habe ich daheim zwar Internet aber kein Matlab - daher sind alle Syntaxbeispiele circa Angaben.....
Zur Klarstellung: Ich weiß nicht mehr, ob es eine geschlossene Lösung gab/gibt. Vermutlich eher nicht, sonst hätte das Netz sie wohl ausgespuckt. Die Lösung mit den Integralen hab ich noch nicht gefunden, die war in irgendeinem Rätselbuch, glaub ich...
Ein Link _________________
Viele Grüße
nschlange
"Chuck Norris ejakuliert fluessigen Stahl!"
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 10.04.2008, 11:04
Titel:
Das fertige, optimierte Programm sah dann so aus (nicht ausprobiert, nur aus dem Gedächtnis noch mal runtergeschrieben):
Code:
groesse = [1000;500];
schaf = [300;1]
ix = repmat(1:groesse(1,1),groesse(2,1),1);
iy = repmat((1:groesse(2,1))',1,groesse(1,1));
W = (ix-schaf(1,1)).^2 + (iy-schaf(2,1)).^2; % wurzel kann man weglassen
W=sort(reshape(W,1,[]));
printf('Halbe Wiese oekogerecht gemaeht bei einer Schnurlaenge von %i Feldern', W(1,groesse(1,1)*groesse(2,1)/2));
Analytische Lösung hab ich keine gefunden, aber auch nicht sehr lang daran herumprobiert.
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.