2011-03-03, 23:59
#1
Hej
Vi håller på med ett projekt i en programmeringskurs där ska lösa en partiell differentialekvation. Man skulle kunna sammanfatta programmet på det här sättet:
En matris initieras med ettor på alla kanter, alltså längs med alla sidor, och nollor överallt annars.
För varje iteration(relaxation) går man igenom varje punkt och punktens värde är ett medelvärde av de kringliggande punkterna, med tillräckligt många iterationer kommer det till slut vara ettor överallt.
Uppgifterna i projektet är att tillämpa olika algoritmer för att få detta att fungera, bland annat jakobi, red/black, SOR och multigrid.
I de sista uppgifterna skall man applicera multigridmetoden. Vi har spenderat ungefär 6-7 timmar på bara att hitta information om detta och försöka förstå oss på den, och sedan lika mycket till att försöka översätta det till kod.
Programmet fungerar såhär just nu:
1. initiera matrisen
2. kör några iterationer med valfri annan relaxtionmetod
3. förminska matrisen (make it more coarse), gör detta 4 gånger och gör punkt 2 mellan varje gång.
4. förstora matrisen (interpolate the matrix, making it more fine), gör detta 4 gånger och gör punkt 2 mellan varje gång.
Matrisen förminskas genom att varannan punkt(både i x och y-led) blir en ny punkt i en annan matris:
Ungefär på samma sätt förstoras matrisen igen:
Problemet som uppstår är att istället för att det är ettor överallt går det mot noll på kanterna och med tillräckligt många iterationer blir även punkterna i mitten noll.
Vi är väldigt osäkra huruvida man ska göra med "boundary condition", med de tidigare algoritmerna så har vi ju inte ändrat på storleken av matrisen. Nu när vi gör det, ska vi då lägga på ettor runt varje matris när vi förminskar den? Eller hur fungerar egentligen med "Dirichlet boundary condition"?
Vi håller på med ett projekt i en programmeringskurs där ska lösa en partiell differentialekvation. Man skulle kunna sammanfatta programmet på det här sättet:
En matris initieras med ettor på alla kanter, alltså längs med alla sidor, och nollor överallt annars.
För varje iteration(relaxation) går man igenom varje punkt och punktens värde är ett medelvärde av de kringliggande punkterna, med tillräckligt många iterationer kommer det till slut vara ettor överallt.
Uppgifterna i projektet är att tillämpa olika algoritmer för att få detta att fungera, bland annat jakobi, red/black, SOR och multigrid.
I de sista uppgifterna skall man applicera multigridmetoden. Vi har spenderat ungefär 6-7 timmar på bara att hitta information om detta och försöka förstå oss på den, och sedan lika mycket till att försöka översätta det till kod.
Programmet fungerar såhär just nu:
1. initiera matrisen
2. kör några iterationer med valfri annan relaxtionmetod
3. förminska matrisen (make it more coarse), gör detta 4 gånger och gör punkt 2 mellan varje gång.
4. förstora matrisen (interpolate the matrix, making it more fine), gör detta 4 gånger och gör punkt 2 mellan varje gång.
Matrisen förminskas genom att varannan punkt(både i x och y-led) blir en ny punkt i en annan matris:
Kod:
Punkten i den nya består alltså av hälften av punkten i den gamla och 1/8 av dennes grannar.|0 1/8 0| |1/8 1/2 1/8| |0 1/8 0|
Ungefär på samma sätt förstoras matrisen igen:
Kod:
I den större(more finer) matrisen så kommer varannan punkt i båda leden vara samma som i den gamla(more coarser) och dess grannar kommer tilldelas hälften eller en fjärdedel av värdet punkten(the coarser). Men eftersom det är varannan punkt så kommer de ha gemensamma grannar, grannarna får då hälften av ena gamla(more coarser) punkten av hälften av nästa gamla punkt. Hörnpunkterna är gemensam granne för fyra punkter(coarser) och de kommer få en fjärdedel av varje sådan punkt. Det här är så krångligt, vet inte hur jag ska förklara det bättre...|1/4 1/2 1/4| |1/2 1 1/2| |1/4 1/2 1/4|
Problemet som uppstår är att istället för att det är ettor överallt går det mot noll på kanterna och med tillräckligt många iterationer blir även punkterna i mitten noll.
Vi är väldigt osäkra huruvida man ska göra med "boundary condition", med de tidigare algoritmerna så har vi ju inte ändrat på storleken av matrisen. Nu när vi gör det, ska vi då lägga på ettor runt varje matris när vi förminskar den? Eller hur fungerar egentligen med "Dirichlet boundary condition"?