Vinnaren i pepparkakshustävlingen!
2016-02-03, 16:44
  #1
Medlem
Hejsan.

Jag har en uppgift som jag fastnat på. Som nybörjare skulle jag behöva lite vägledning för att lösa ett problem.

Jag ska skriva ett program som beräknar minsta y och dess tillhörande x som uppfyller :

abs((x/y)-pi) < abs((355/113)-pi).

Dvs jag vill finna en bättre approximation av pi än 355/113.

Jag antar att jag ska använda mig av en while-loop ist för en for-loop eftersom jag inte vet hur stora värden jag letar efter. Såhär långt har jag kommit:

x = 1; % Initialvärde
y = 1; % Initialvärde
a = abs((355/113)-pi) ;
b = abs((x/y)-pi) ;

while b > a % Så länge som b är större än a, upprepa följande
x = x + 1;
y = y + 1; % Här känns det som att jag tänker fel och kommer inte längre.

if b < a % Om jag hittar en bättre approximation så skriv ut värdena på x och y.
disp([x,y])
end
end


Någon vänlig själ som kan hjälpa mig komma vidare härifrån?
__________________
Senast redigerad av bigkjell85 2016-02-03 kl. 16:52.
Citera
2016-02-03, 18:12
  #2
Medlem
nihilverums avatar
Din existerande loop kommer inte att producera några bra approximationer eftersom x och y är lika stora i varje steg, så kvoten x/y kommer hela tiden att ha värdet 1.

Dessutom, för att hitta bra approximationer så behöver du en nästlad loop så att du för varje nytt värde på y prövar flera värden på x. Exempelvis kan du börja med att x = 3*y för varje nytt värde på y, och sedan ökar du på x med 1 och testar kvoten tills x blir större än exempelvis 3.15 gånger y, eftersom du då vet att högre värden på x inte kommer att ge bra approximationer.
Citera
2016-02-03, 19:53
  #3
Medlem
Jag är med på allt, men jag har ingen aning om hur jag ska utföra det du beskriver i sista meningen:

"Exempelvis kan du börja med att x = 3*y för varje nytt värde på y, och sedan ökar du på x med 1 och testar kvoten tills x blir större än exempelvis 3.15 gånger y, eftersom du då vet att högre värden på x inte kommer att ge bra approximationer."

Ska jag använda mig av for eller while-loop? Känner mig helt vilse o uppgiven...
Citera
2016-02-03, 20:05
  #4
Medlem
Är det nått sånt här du tänker på?

Kod:
1;   
3*y;  
abs((355/113)-pi) ;   
abs((x/y)-pi) ;  

while 
Så länge som b är större än aupprepa följande    
1
 while 
x/3.15   
  y 
1;   
end 
end 
__________________
Senast redigerad av bigkjell85 2016-02-03 kl. 20:32.
Citera
2016-02-03, 21:23
  #5
Medlem
nihilverums avatar
Citat:
Ursprungligen postat av bigkjell85
Jag är med på allt, men jag har ingen aning om hur jag ska utföra det du beskriver i sista meningen:

"Exempelvis kan du börja med att x = 3*y för varje nytt värde på y, och sedan ökar du på x med 1 och testar kvoten tills x blir större än exempelvis 3.15 gånger y, eftersom du då vet att högre värden på x inte kommer att ge bra approximationer."

Ska jag använda mig av for eller while-loop? Känner mig helt vilse o uppgiven...

Citat:
Ursprungligen postat av bigkjell85
Är det nått sånt här du tänker på?

Kod:
1;   
3*y;  
abs((355/113)-pi) ;   
abs((x/y)-pi) ;  

while 
Så länge som b är större än aupprepa följande    
1
 while 
x/3.15   
  y 
1;   
end 
end 

Du kan formulera det med while-loopar, men du kan inte börja med att sätta x = x + 1 i din loop. Istället börjar du med att sätta y = y + 1 och x = 3*y. Sedan räknar du om b och så länge x/y är mindre än 3.15 (inte större, som du skrivit här) så prövar du att öka x med 1 och räkna om b. När x/y blir 3.15 eller större så är det dags för nästa varv med y = y + 1.
Citera
2016-02-04, 14:37
  #6
Medlem
Jag har kommit hit, hur ser det ut tycker du? Uträkningen tar en evighet. Finns det något jag kan göra för att optimera koden?
Kod:
1;
3*y;
abs((355/113)-pi) ;
abs((x/y)-pi) ;
while 
Så länge som b är större än aupprepa följande
1;
while 
x/3.15
1;
end
end 
Citera
2016-02-04, 18:18
  #7
Medlem
nihilverums avatar
Citat:
Ursprungligen postat av bigkjell85
Jag har kommit hit, hur ser det ut tycker du? Uträkningen tar en evighet. Finns det något jag kan göra för att optimera koden?
Kod:
1;
3*y;
abs((355/113)-pi) ;
abs((x/y)-pi) ;
while 
Så länge som b är större än aupprepa följande
1;
while 
x/3.15
1;
end
end 

Du måste räkna om b efter varje gång du ökar på x med 1. Annars kommer dina loopar aldrig att ta slut och aldrig att skriva ut något. Dessutom måste du återställa x = 3*y efter varje gång du uppdaterar y till y + 1.
Citera

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback