Mathematica 7 - polinomi
Select messages from
# through # FAQ
[/[Print]\]

Forum@DeGiorgi -> Čistilište

#1: Mathematica 7 - polinomi Autor/ica: athlet PostPostano: 14:00 ned, 30. 5. 2010
    —
Pozdrav svima!
Imam problem u vezi jednog zadatka a potrebno je koristiti Mathematicu: Zadani su prirodni brojevi n i m. Moram napisati algoritam koji će generirati sve polinome stupnja manjeg od n s cjelobrojnim koeficijentima iz segmenta [-m,m].
Zatim moram za svaki od tih polinoma odrediti nultočke i prikazati ih kao točke u kompleksnoj ravnini.
Nadam se da ima netko tko mi može dati nekakav savjet, hitno mi je.
Tnx !

#2:  Autor/ica: goranm PostPostano: 18:14 ned, 30. 5. 2010
    —
Prva ideja koja mi pada na pamet je prilično brute force i u nekim koracima se dosta može optimizirati.

Ideja je ta da se formiraju sve uređene n-torke čiji su elementi iz skupa [-m,m]. To se postiže funkcijom Tuples[Range[-m,m],n]. Uređene n-torke će nam trebati jer će prva označavati slobodan član, druga koeficijent uz x, treća uz x^2 itd.

Sve te n-torke čine listu koju nazovemo npr. koef i zatim pomoću funkcije FromCoefficientRules konstruiramo sve polinome sa koeficijentima iz liste koef.

Funkcija FromCoefficientRules zahtjeva poseban format pravila kojim konstruira polinome, a to pravilo je oblika

Kod:
{{0}->a[0],{1}->a[1],...,{n-1}->a[n-1]}


(vidi help za detalje) što znači da se 0-tom članu polinoma pridružuje koeficijent a[0], prvom članu se pridružuje koeficijent a[1] itd. pa će biti potrebno napisati funkciju koja uređenoj n-torki oblika {a[0],a[1],...,a[n-1]} pridružuje n-torku oblika {{0}→a[0],{1}→a[1],...,{n-1}→a[n-1]}. To nije teško, napravi se pomoću jedne for petlje i funkcije AppendTo.

Cijeli ovaj postupak se utrpa u funkciju koju nazovemo npr. generator[n_,m_] koja će vratiti listu sa svim generiranim polinomima.

To je bio najteži dio zadatka, dalje je jednostavnije. Za rješavanje polinoma mogu se koristiti funkcije Root ili Solve, a prikaz u kompleksnoj ravnini je isto kao što i prikaz u gdje je nultočka x+iy nekog polinoma prikazana kao točka (x,y) u .

Added after 48 minutes:

A evo i koda.

Citat:
Kod:
ToPolynomial[koef_List] := Module[{i, rules = {}},
  For[i = 0, i <= Length[koef] - 1, i++,
   AppendTo[rules, {i} -> koef[[i + 1]]]
   ];
  Return[rules]
  ]


Kod:
generator[n_Integer, m_Integer] :=
 Module[{i, lista1 = {}, lista2 = {}, polinomi = {}},
  lista1 = Tuples[Range[-m, m], n];
  For[i = 1, i <= Length[lista1], i++,
   AppendTo[lista2, ToPolynomial[lista1[[i]]]
     ];
   ];
  polinomi = MapThread[FromCoefficientRules, {{lista2}, {x}}][[1]];
  Return[polinomi]
  ]


Kod:
Nul[poly_] := Module[{i, nultocke = {}},
  For[i = 1, i <= Exponent[poly, x], i++,
   AppendTo[nultocke, Root[poly, i]]];
  Return[nultocke]
  ]


Kod:
Koord[poly_] := Module[{lista = {}},
  For[i = 1, i <= Length[Nul[poly]], i++,
   AppendTo[lista, {Re[Nul[poly][[i]]], Im[Nul[poly][[i]]]}]
   ];
  Return[lista]
  ]


Kod:
NacrtajRjesenja[polinomi_List, element_Integer] :=
 ListPlot[Koord[polinomi[[element]]]]


Uz napomenu da su svi računi egzaktni. Budući postoje polinomi čije nultočke Mathematica ne zna egzaktno izračunati, za te polinome neće uspjeti nacrtati rješenja. Tu bi se trebala, kod traženja nultočaka polinoma u funkciji Nul, ubaciti neka funkcija koja će naći numeričko rješenje.


Zadnja promjena: goranm; 20:54 ned, 30. 5. 2010; ukupno mijenjano 1 put.

#3:  Autor/ica: Gost PostPostano: 18:48 ned, 30. 5. 2010
    —
Stvarno se zahvaljujem na iscrpnom odgovoru. Vidim da si mi napisao i kod, pošto ja nisam baš upućen skroz u mathematicu ipak su mi neke stvarni ne jasne. Ovo kod rules mi nije jasno šta se tu ustvari definira. Ako mi možeš malo pojasnit kod



Kod:
{{0}->a[0],{1}->a[1],...,{n-1}->a[n-1]}


kako da definiram te sve članove, jer mi , ..., ne prihvaća te točkice?

#4:  Autor/ica: goranm PostPostano: 20:52 ned, 30. 5. 2010
    —
To su pravila pomoću kojih mathematica generira polinom kada su zadani samo koeficijenti.

Npr. sa
Kod:
FromCoefficientRules[{{0}->1,{1}->1,{2}->1,{3}->1},x]

generirati će se polinom , dok će
Kod:
FromCoefficientRules[{{0}->-17,{1}->3,{2}->7,{3}->-5,{4}->9},x]

generirati polinom .

Točkice neće prihvatiti jer eksplicitno moraš definirati sve koeficijente. Ukoliko želiš generirati polinom npr. moraš pozvati funkciju FromCoefficientRules sa argumentom

Kod:
{{0}->17,{1}->0,{2}->0,{3}->19}

#5:  Autor/ica: Gost PostPostano: 11:24 pon, 31. 5. 2010
    —
Skužio sam to za FromCoefficientRules funkciju, ali mi baš i ne generira polinome. Ovaj tvoj kod je potpun ili treba nešto mjenjati? Probao sam svašta ali mi ne ide baš.

#6:  Autor/ica: goranm PostPostano: 14:04 pon, 31. 5. 2010
    —
Da, moj kod radi. Ne mogu ti bolje pomoći ako ne napišeš svoj kod i što se izbaci kao output, neka greška ili nešto drugo.

#7:  Autor/ica: Gost PostPostano: 14:14 pon, 31. 5. 2010
    —
goranm (napisa):
Da, moj kod radi. Ne mogu ti bolje pomoći ako ne napišeš svoj kod i što se izbaci kao output, neka greška ili nešto drugo.


Kad ga probam u Mathematici ništa mi ne izbacuje, pa sam mislio možda da nisi sve varijable definirao, nemam pojma. Pretpostavljam da ja nešto krivo radim samo ni nije jasno šta.

#8:  Autor/ica: goranm PostPostano: 14:59 pon, 31. 5. 2010
    —
Anonymous (napisa):
goranm (napisa):
Da, moj kod radi. Ne mogu ti bolje pomoći ako ne napišeš svoj kod i što se izbaci kao output, neka greška ili nešto drugo.


Kad ga probam u Mathematici ništa mi ne izbacuje, pa sam mislio možda da nisi sve varijable definirao, nemam pojma. Pretpostavljam da ja nešto krivo radim samo ni nije jasno šta.

Napiši ovdje točno ono što si napisao u Mathematici (ili napravi printscreen presliku ekrana), ovako napamet ne mogu znati zašto ti ne radi.

#9:  Autor/ica: Gost PostPostano: 15:39 pon, 31. 5. 2010
    —
Kod:
ToPolynomial[koef_List]  := Module[{i, rules = {}},
  For[i = 0, i <= Length[koef] - 1, i++,
   AppendTo[rules, {i} -> koef[[i + 1]]]
    ];
  Return[rules]
   ]

generator[n_Integer, m_Integer] :=
 Module[{i, lista1 = {}, lista2 = {}, polinomi = {}},
  lista1 = Tuples[Range[-m, m], n];
  For[i = 1, i <= Length[lista1], i++,
   AppendTo[lista2, ToPolynomial[lista1[[i]]]
      ];
    ];
  polinomi = MapThread[FromCoefficientRules, {{lista2}, {x}}][[1]  ];
  Return[polinomi]
   ]

Nul[poly_] := Module[{i, nultocke = {}},
  For[i = 1, i <= Exponent[poly, x], i++,
   AppendTo[nultocke, Root[poly, i]]];
  Return[nultocke]
   ]

Koord[poly_] := Module[{lista = {}},
  For[i = 1, i <= Length[Nul[poly]], i++,
   AppendTo[lista, {Re[Nul[poly][[i]]], Im[Nul[poly][[i]]]}]
    ];
  Return[lista]
   ]

NacrtajRjesenja[polinomi_List, element_Integer] :=
 ListPlot[Koord[polinomi[[element]]]]



Ubacim kao što si i ti napisao prvi put kod. Kad ga pokušam pokrenuti ništa se ne događa. Nešto krivo radim, a neznam što.

#10:  Autor/ica: goranm PostPostano: 15:53 pon, 31. 5. 2010
    —
Ništa se ne događa jer se te funkcije, nakon učitavanja, trebaju i pokrenut sa nekim konkretnim argumentima.

Nakon što te funkcije učitaš u memoriju i onda upišeš npr. generator[3,2], to će generirati sve polinome stupnja manjeg od 3 sa cjelobrojnim koeficijentima iz [-2,2], tj. napraviti će se lista čiji su elementi takvi polinomi.

Funkcijom NacrtajRjesenja[generator[n,m],i] nacrtati će rješenja i-tog polinoma u listi generator[n,m].

Npr. NacrtajRjesenja[generator[3,2],1] nacrtati će rješenja polinoma -2-2x-2x^2 jer je taj polinom prvi element liste generator[3,2].

Samo mala napomena: jer su svi računi egzaktni, Mathematica neće moći egzaktno naći rješenja nekih polinoma i tu bi se funkcije za nalaženje nultočaka trebale zamijeniti pripadnim numeričkim funkcijama.

#11:  Autor/ica: Gost PostPostano: 16:05 pon, 31. 5. 2010
    —
In[41]:= generator[3, 2]

During evaluation of In[41]:= FromCoefficientRules::cstruct: The coefficient list {ToPolynomial[Range[-m,m]],ToPolynomial[n]} does not have the correct structure. >>

Out[41]= FromCoefficientRules[{ToPolynomial[Range[-m, m]],
ToPolynomial[n]}, x][code]



To dobijem sad, kad unesem generator[3,2].

#12:  Autor/ica: goranm PostPostano: 17:28 pon, 31. 5. 2010
    —
Ne znam zašto to radi. Da li si pokrenuo funkciju ToPolynomial? Probaj staviti čitav kod u jednu ćeliju i onda u idućoj pokreni generator[3,2]. Tako bi trebalo biti isto kao i kod mene, a meni izbacuje:


#13:  Autor/ica: Gost PostPostano: 17:48 pon, 31. 5. 2010
    —
a evo sad i meni isto izbacuje. Možda se mathematica malo zablokirala. Ponovo sam ju pokrenu i sad hoće. E hvala ti što si odvojio vrijeme za pomaganje i pravljenje koda. Imaš piće negdje Very Happy
Daj mi samo reci kako da sad za svaki taj polinom izračunam nultočku, tj. jel isto moram koristiti for petlju s nekim brojačem?

#14:  Autor/ica: Gost PostPostano: 18:12 pon, 31. 5. 2010
    —
Kužim sad kako radi i sve, ali tek kad si mi objasnio. Da dobijem sva rješenja, znači brojčana, trebao bi koristit funkciju NSolve. Komplicirano mi je to napravit za svaki, odnosno u petlji jer nisam skoro pa nikad radio u mathematici. Jesam neke trivijalne zadatke, ali ovo je ipak puno kompliciranije. Isto tako bi mi trebao sve te točke nacrtati na jednom grafu.

#15:  Autor/ica: goranm PostPostano: 18:48 pon, 31. 5. 2010
    —
Da, možeš sa for petljom u kojoj i ide od 1 do Length[generator[n,m]] i u svakom koraku računa nultočkue od generator[n,m][[i]], tj. od i-tog polinoma u listi generator[n,m]. Rješenja polinoma nalaze se funkcijom Roots ili Solve.

Malo brži (i puno manje čitljiv) način je da funkciju Roots primijeniš na čitavu listu generator[n,m], npr.

Kod:
Map[Roots[#, x] &, Map[# == 0 &, generator[3, 2]]]


će izbaciti rješenja za sve polinome (osim konstantnih) u listi generator[3,2].

Ako trebaš rješenja svih polinoma nacrtat na jednom grafu, onda se samo treba formirati lista čiji su elementi koordinate (x,y) koje predstavljaju nultočku x+iy nekog polinoma. Funkciju koja nultočke x+iy nekog polinoma pretvara u koordinate (x,y) već imaš, to je funkcija Koord[poly]. Sada se samo treba nekako formirati lista svih nultočaka, npr. sa
Kod:
SveNultocke[polinomi_List] := Module[{i, nultocke = {}},
  nultocke = Koord[polinomi[[1]]];
  For[i = 2, i <= Length[polinomi], i++,
   nultocke = Union[nultocke, Koord[polinomi[[i]]]]
   ];
  Return[nultocke]
  ]

i onda će se pozivom funkcije
Kod:
ListPlot[SveNultocke[generator[3,2]]]
nacrtati sve nultocke svih polinoma stupnja manjeg od 3 sa cjelobrojnim koeficijentima iz [-2,2].



Forum@DeGiorgi -> Čistilište


output generated using printer-friendly topic mod. Vremenska zona: GMT + 01:00.

Stranica 1 / 1.

Powered by phpBB © 2001,2002 phpBB Group
Theme created by Vjacheslav Trushkin