lund är nöjd med hjälpen
lund 529
Postad: 18 feb 2021 16:12 Redigerad: 18 feb 2021 16:17

Hitta vid vilket n matrisen konvergerar mha en loop

Jag ska skapa en loop i R Markdown där jag med hjälp utav tre definierade funktioner ska hitta när matrisen P konvergerar, det vill säga vid vilket n Pn=Pn+1. De definierade funktionerna är följande:

```{r}
mpow <- function(A, n) {
resultat <- diag(nrow(A)) 
potens <- n
while (potens > 0) {
    resultat <- A %*% resultat
    potens <- potens - 1
  }
return(resultat) 
}

rows_equal <- function(A, d = 4) {
A_new <- trunc(A * 10^d)
for (k in 2:nrow(A_new)) {
  if (!all(A_new[1, ] == A_new[k, ])) {

} }

matrices_equal <- function(A, B, d = 4) {
A_new <- trunc(A * 10^d) 
B_new <- trunc(B * 10^d) 
if (all(A_new == B_new)) {
  return(TRUE) } else {
    return(FALSE) }
}
```

Jag ska i denna loop använda mig utav fyra decimaler och dessa ska vara identiska när vi har hittat rätt n. Jag har försökt att göra detta med följande:

```{r}
n<-1;
while(!(rows_equal(mpow(P,n), 4) & matrices_equal(mpow(P,n), mpow(P, n+1), 4) ))
{
  n=n+1;
}
```

Men jag får inget returvärde, jag har aldrig tidigare skapat en loop i R Markdown och uppskattar all hjälp som jag kan få med att förstå varför while-loopen inte returnerar någonting?

Edit: Jag la in return(n) i funktionen och då fungerade det, hade testat detta tidigare men hade då lagt in det på fel ställe. Här är den korrekta, har någon lust att förklara varför return-satsen ska vara utanför hakparanteserna?

```{r}
n<-1;
while(!(rows_equal(mpow(P,n), 4) & matrices_equal(mpow(P,n), mpow(P, n+1), 4) ))
{
  n=n+1;
}
return(n)
```
Skaft 2373 – F.d. Moderator
Postad: 20 feb 2021 11:55

Har ingen koll på R, men "return" brukar i programmeringssammanhang innebära "avsluta funktionen" och så skickas ett resultat tillbaka dit funktionen kallades ifrån. Och det du sätter innanför loopens {}-klamrar är det som upprepas ett visst antal gånger.

Sätter du då "return" inuti loopens {}-uttryck, ger du motstridiga instruktioner: dels "upprepa dessa rader", men också "avsluta funktionen". Funktionen kan inte avslutas mer än en gång, när den är klar är den klar. Loopen går alltså inte klart utan avbryts genom ditt return. Genom att returnera efter att {} stängts låter du loopen gå klart, och först efteråt avslutar funktionen.

Svara Avbryt
Close