Problem med att skapa en matris och fylla i den
Jag har en läxa i min Python kurs med olika uppgifter och i en av dem inkluderas det att skapa en matris samt att fylla i den med vissa värden.
I programmet har jag gjort en block kod som först genererar ut vissa värden och sen har jag satt dessa värden i en lista. Denna lista vill jag sedan sätta in i den första raden av matrisen som jag använder i en funktion och sedan med hjälp av en viss ekvation, skapa en siffra och sedan även lägga till denna i matrisen. Jag ska till sist få ett svar, men matrisen är alltid tom. Jag har varit i kontakt med en assistens i min kurs som har påpekat en specifik linje i min kod och sagt att jag inte skapar min matris på ett smart sätt. Om matrisen börjas på ett bättre sätt så kommer enligt honom resten av koden att funka.
Nu är problemet att jag har googlat och sökt på flera olika sätt att skapa matriser men inget av dem funkar direkt? Matrisen är fortfarande tom och jag får alltid bara nya fel på vägen. Jag har skrivit flera kommentarer i koden så ni hänger med vad jag försöker göra. Jag får verkligen inte fatt på varför matrisen inte fylls upp. Vår föreläsare gav oss en bild av att matrisen ska likna en "triangel matris"(upper triangle matrix). Det är det sista värdet i matrisen som jag vill komma åt.
Koden har vissa engelska kommentarer.
Jag är tacksam för all hjälp och alla tips ni har!
from matplotlib.pyplot import *
from numpy import *
from matplotlib import pyplot as plt
import numpy as np
# Task 4
x = float(input("x=")) #the user can write in their own x value
n = 10 #this is the number of iterations the code will do. The more iterations, the better result of the function.
ams = [] #create an empty list so that we may later store our ai values
dss = [[] for k in range(0, n+1)] #create an empty matrix using type constructor. #!! Det här är något min assistent tycker att jag borde ändra. Han tipsade om att använda arrays(vektorer) istället, men jag kommer inget vart med det heller. Jag har testat np.empty och np.zeros med en viss matris storlek men det hjälper inte.
#Detta är en kod som ger ett approximerat värde av funktionen ln(x). Alla ai och gi värden används för att få det approximerade värdet.
if x > 0:
ai = (1+x)/2 #formel för ai
gi = sqrt(x) #formel för gi
for i in range(n):
ai_next = (ai+gi)/2 #nästa ai
gi_next = sqrt(ai_next*gi) #nästa gi
ai = ai_next
gi = gi_next
ams.append(ai) #add ai to ams
#print(ams) #just to make sure that ams is filled, and it is.
#Här definerar jag en funktion som adderar elementerna i ams till första raden i matrisen dss, som jag sedan vidare fyller på
def fast_approx_ln(x, n):
for k in range(0,1):
for i in range(0,n+1):
dss[0].append(ams[i]) #add the elements of ams to the first row of dss. This does not work. Dss is still empty.
for k in range(1, n+1): #add d(k,i) to the matrix. Basically fill it out using the recursion formula.
for i in range(0, n+1):
d = (dss[k-1][i] - 4**(-k)*dss[k-1][i-1])/(1-4**(-k)) #Detta är en ekvation som ger ett siffervärde. Detta ska sedan läggas till i dss.
dss[k].append(d) #appending the variable d to dss
return (x-1)/dss[-1][-1] #heres our answer. dss[-1][-1] is the last element in the matrix dss. Detta är alltså det slutgiltiga svaret, här är det approximerade värdet av ln(x)
print(fast_approx_ln(x, n))
#print(f"size:{len(dss)}x{len(dss[0])} dss:{dss}") # to check if dss is filled. it is not :')
Du kan använda numpy's array och det kanske är "smartare" men jag tror ditt sätt fungerar också. Det enda jag kan se som stökar till det är att du i fast_approx_ln indicerar dina vektorer med range (0, n+1) vilket ger dig elementen 0, 1 ... n som är ett element för mycket . Du kan dessutom utelämna första index eftersom 0 är default för första index. Prova range ( n ). Det gäller definitionen av dss också.
En generell kommentar är också att använda identifierare i dina funktioner/metoder som inte är samma som de som definierats globalt, t ex så har du identifieraren i både globalt och som index lokalt i din funktion/metod.
CurtJ skrev:Du kan använda numpy's array och det kanske är "smartare" men jag tror ditt sätt fungerar också. Det enda jag kan se som stökar till det är att du i fast_approx_ln indicerar dina vektorer med range (0, n+1) vilket ger dig elementen 0, 1 ... n som är ett element för mycket . Du kan dessutom utelämna första index eftersom 0 är default för första index. Prova range ( n ). Det gäller definitionen av dss också.
En generell kommentar är också att använda identifierare i dina funktioner/metoder som inte är samma som de som definierats globalt, t ex så har du identifieraren i både globalt och som index lokalt i din funktion/metod.
Tack så mycket för hjälpen! Jag lämnade kvar range(n+1) eftersom den behövdes till programmet. Detta är för att då jag skrev (n) så kördes det n-1 iterations istället för n. Alltså n=100 kördes 99 gånger. Men jag fick framsteg av att använda numpy's array! Efter lite tweaks så fylldes matrisen upp!