Temperaturberäkningar
Jag vill räkna ut temperaturen i varje inre meshpoint genom att ta medelvärdet av de 4 omkringliggande punkterna. Eftersom att beräkningen börjar från den andra raden och andra kolumnen blir temperaturerna dock större ju längre "sydöst" man tittar även om alla boundary meshpoints tilldelas samma värde (pga att den första punkten har 2 omkringliggande punkter som är noll till skillnad från de andra hörnpunkterna). Hur kommer man runt det problemet?
import numpy as np
def berakna(u):
for i in np.arange(1, bredd-1):
for j in np.arange(1, bredd-1):
u[i, j] = round((u[i+1][j] + u[i-1][j] + u[i][j+1]+u[i][j-1])/4)
return u
bredd=int(input("Hur många rader/kolumner ska matrisen vara?"))
tak=int(input("Vilken temperatur ska taket vara?"))
vanster=int(input("Vilken temperatur ska vänster sida vara?"))
hoger=int(input("Vilken temperatur höger sida vara?"))
golv=int(input("Vilken temperatur ska golvet vara?"))
u=np.empty((int(bredd), (bredd)))
u.fill(0)
u[:1, 1:] = tak
u[:, :1] = vanster
u[(bredd-1):, :] = golv
u[:, (bredd-1):] = hoger
u = berakna(u)
print(u)
Om det bara finns två grannpunkter så får du beräkna medelvärdet av bara de två, alltså summera och dela med två.
Det är väl rimligt att du itererar till du får ett jämviktsläge eftersom alla punkter ändras vid varje iteration innan dess. Testa att köra en loop tills inget värde har förändrats i iterationen. Du borde få det till att alla punkter är 10 i ditt exempel. Det motsvarar en bit metall som är 10x10 som läggs in i en ugn som är 10. Det tar ett tag för det inre att nå samma temperatur men det kommer dig med tiden. I en utveckling kan man lägga in en "tröghetsfaktor" som motsvaras av materialets värmekonduktivitet och sen se hur lång tid det tar men det är nästa steg.
Varje iteration utgår från förra iterationens värden så alla element innanför kantelementen påverkas lika. Dvs beräkna alla element och när alla element är uppdaterade så beräknar du nästa iteration. Du låter beräkningen från en rad/kolumn påverka nästa rad/kolumn i samma iteration och då får du det resultat du får. Tänk dig att alla element påverkas momentant i en iteration.
CurtJ skrev:Det är väl rimligt att du itererar till du får ett jämviktsläge eftersom alla punkter ändras vid varje iteration innan dess. Testa att köra en loop tills inget värde har förändrats i iterationen. Du borde få det till att alla punkter är 10 i ditt exempel. Det motsvarar en bit metall som är 10x10 som läggs in i en ugn som är 10. Det tar ett tag för det inre att nå samma temperatur men det kommer dig med tiden. I en utveckling kan man lägga in en "tröghetsfaktor" som motsvaras av materialets värmekonduktivitet och sen se hur lång tid det tar men det är nästa steg.
Uppgiften är dock att avgöra vart man ska placera ett element så att rummets medeltemperatur blir så hög som möjligt och då är jämviktsläget kanske inte särskilt intressant?
Iterationen beskriver ett momentanläge. Jag gissar att det är vettigt att placera elementet där du har lägst temperatur i varje iteration och när du har samma randvillkor så lär det hamna i mitten av rummet.
Det här är en övning där man kan använda ett kalkylark på ett smidigt sätt.
Till allra första börja med borde du antingen skicka in bredd som en parameter eller ännu hellre använda len() för att ta reda på matrisens storlek inne i beräkna.
sen är det väl så att varje punkt omges av 8 andra punkter?
Analys skrev:Till allra första börja med borde du antingen skicka in bredd som en parameter eller ännu hellre använda len() för att ta reda på matrisens storlek inne i beräkna.
sen är det väl så att varje punkt omges av 8 andra punkter?
Hur menar du räcker inte bredd inputen? Ja de omges av 8 punkter men temperaturen är ungefär medelvärdet av de 4 gränsande punkterna
Baguesses skrev:Analys skrev:Till allra första börja med borde du antingen skicka in bredd som en parameter eller ännu hellre använda len() för att ta reda på matrisens storlek inne i beräkna.
sen är det väl så att varje punkt omges av 8 andra punkter?Hur menar du räcker inte bredd inputen? Ja de omges av 8 punkter men temperaturen är ungefär medelvärdet av de 4 gränsande punkterna
Angående bredd så är det ju en global variabel. Mkt enklare att följa flödet om den skickas in som parameter till berakna eller använder len() för att ta reda på matrisens storlek.
sen finns det i scipy funktioner som gör faltning, convolution på engelska, i 2 dim som gör beräkningen du vill göra. Här finns det stöd för lite olika metoder kring boundaries.