Seuraa 
Viestejä899
Liittynyt19.3.2005

Hei,

Koetin opetella ohjelmointia. Löysin tällaisen tehtävän: http://www.ohjelmointiputka.net/postit/tehtava.php?tunnus=muslam . Minusta tuo pitäisi ratketa suoraviivaisesti matriiseilla yli Z/2Z:n. Miksi kuitenkaan tämä ratkaisuni ei toimi huoneeseen B?

# Museon lamput.

# Museon lamput ratkeaa matriisiyhtälöllä yli Z/2Z:n. Matriisit voidaan tehdä Pythonissa listoilla.

# Sanotaan, että ensimmäinen indeksi kuvaa pystysuuntaa ja toinen vaakasuuntaa.

# Tämä funktio generoi wxn nollamatriisin
def generate_matrix(w, h):
return [[0 for x in range(w)] for y in range(h)]

# Nyt matriisin tulostus sujuu seuraavasti:

def print_matrix(A):
for row in range(0,len(A[0])):
for col in range(0,len(A[0])):
line += A[row][col]
if col == len(A[0]):
line += "\n"
print(A)

# Alkeisrivioperaatio: Vaihda kaksi riviä keskenään.
def swap_rows(A,i,j):
for k in range(0,len(A[0])):
temp = A[k][i]
A[k][i] = A[k][j]
A[k][j] = temp
return A

# Alkeisrivioperaatio: Lisää riviin toinen rivi.
def mult_rows(A,i,j):
for k in range(0,len(A[0])):
A[k][j] += A[k][i]
return A

# Kahden indeksin etäisyys toisistaan.
def dist(i,j,n):
d1 = max(i-j,j-i)
dist_beg = min(i,j)
dist_end = n-max(i,j)
d2 = dist_beg + dist_end
return min(d1,d2)

# Kerroinmatriisin alustus
def gen_coeff_matrix(n,effect_width):
A = generate_matrix(n,n)
for i in range(0,n):
for j in range(0,n):
if dist(i,j,n) <= effect_width:
A[i][j] = 1
return A

# Yksikkömatriisin alustus
def init_unit_matrix(n):
A = generate_matrix(n,n)
for i in range(0,n):
A[i][i] = 1
return A

# Matriisin käännös. Edetään sarakkeittain. Jos diagonaalilla on nolla, vaihdetaan rivit alhaalta jotta diagonaalille tulee nolla. Tämän jälkeen eliminoidaan muut rivit.
def inv(M):
n = len(M[0])
U = init_unit_matrix(n)
for column in range(0,n):
if M[column][column] == 0:
i = 1
while M[column+i][column+i] != 0:
++i
swap_rows(A,column,column+i)
swap_rows(U,column,column+i)
# Nyt diagonaalilla on varmasti ykkönen. Käytetään tätä eliminoimaan loput alkiot sarakkeelta.
for c in range(0,n):
if M[c][column] == 1:
if c != column:
mult_rows(M,c,column)
mult_rows(U,c,column)
return U

A=init_unit_matrix(5,5)
print(A)

Kommentit (6)

pöhl
Seuraa 
Viestejä899
Liittynyt19.3.2005

Öläskiperse kirjoitti:
C:llä ja Gaussin eliminointimenetelmällä koodi mahtuu yhdelle A4:lle.

Ny kyllä toi Python-koodikin menee yhdelle A4:lle mutta ajattelin selveyden vuoksi tehdä vähän väljemmin. En vaan löydä bugia. Harmillista, että palsta tuhoaa sisennykset.

Kyttääjä
Seuraa 
Viestejä447
Liittynyt4.1.2016

No mitenkäs ratkaisisit sadantuhannen tuntemattoman nauhamatriisin tuolla Pythonillasi? FEM generoi helposti 100000 yhtälöryhmän.

Usein ratkaisua joudutaan lisäksi iteroimaan, jolloin yhtälöryhmä on ratkaistava lähestulkoon reaaliajassa. Ei onnistu kuuna päivänä Pythonilla.

Python on tulkkaava kieli kuten mm. Basic-kieli. Jos pitää aivan väkisin tehdä ohjelma maailman hitaimmalla ohjelmointikielellä, on sama, vaikka koodin tekisi Comal-kielellä. Sekin on satakertaa parempi kuin Python.

Vastauksestani saattaa huokua, etten oikein pidä Pythonista. Tämä on totta - Python on perseestä. Nyt kaikki opiskelemaan Pythonia.

Olet oikeassa kuitenkin siinä suhteessa, että on älytöntä olla tiedefoorumi, jossa ei ole mahdollisuutta esittää koodia koodina tasavälisillä fonteilla. Tiede.fi on ottanut mallia Vauva-lehden keskustelupalstasta! Saatanan mulkut!

pöhl
Seuraa 
Viestejä899
Liittynyt19.3.2005

Eikö Python ole Turing-täydellinen siinä missä C:kin? Tällöin Pythonilla voi tehdä kaikki asiat samalla nopeudella kuin C:llä. Tosin eipä taida olla mitenkään luonnollista tapaa kirjoittaa Pythonilla ohjelma, joka kääntää Pythonia konekielelle.

pöhl
Seuraa 
Viestejä899
Liittynyt19.3.2005

Hmm. Ajattelin tehtävää ilmeisesti väärin. Tapani ajatella ongelmaa tuottaa singulaarisen kerroinmatriisin. Pitää keksiä joku toinen tapa ratkoa probleema.

Suosituimmat

Uusimmat

Uusimmat

Suosituimmat