Springen naar inhoud

Mathematica: lijstjes maken


  • Log in om te kunnen reageren

#16

Lapzwans

    Lapzwans


  • >100 berichten
  • 145 berichten
  • Ervaren gebruiker

Geplaatst op 03 mei 2009 - 13:31

Dank je wel =D> Weet je ook of ik misschien dat 'BestFitParameters --->' ervoor nog weg kan krijgen? Want op dit moment krijg ik bijvoorbeeld als ik typ fit2[[1]] nog steeds: BestFitParameters --> {0.66667, 1.5}. De bedoeling is dat ik de waarden van a en b in een tabelletje stop, dus dat BestFitParameters moet dan eigenlijk er voor weg.

L1 = {{{1, 2}, {2, 4}, {3, 5}}, {{1, 3}, {2, 3}, {3, 5}}};
fit = Table[Regress[L1[[i]], x, x, RegressionReport -> {BestFitParameters}], {i,1, 2}]

Dit forum kan gratis blijven vanwege banners als deze. Door te registeren zal de onderstaande banner overigens verdwijnen.

#17

Phys

    Phys


  • >5k berichten
  • 7556 berichten
  • VIP

Geplaatst op 03 mei 2009 - 14:03

L1 = {{{1, 2}, {2, 4}, {3, 5}}, {{1, 3}, {2, 3}, {3, 5}}};

fit = Table[Regress[L1[[i]], x, x, RegressionReport -> {BestFitParameters}], {i, 1, 2}];

Table[BestFitParameters /. fit[[i]], {i, 1, 2}]
Never express yourself more clearly than you think.
- Niels Bohr -

#18

Lapzwans

    Lapzwans


  • >100 berichten
  • 145 berichten
  • Ervaren gebruiker

Geplaatst op 03 mei 2009 - 14:36

Je hebt nu wel genoeg bedankjes gehad, dus nog eentje dan: Bedankt! =D>

Veranderd door Lapzwans, 03 mei 2009 - 14:36


#19

Lapzwans

    Lapzwans


  • >100 berichten
  • 145 berichten
  • Ervaren gebruiker

Geplaatst op 03 mei 2009 - 15:49

Nog een vraagje over deze post. We hebben dus:

L1 = {a, b, c};
L2 = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
L3 = Table[Table[{L1[[i]], L2[[k]][[i]]}, {i, 1, 3}], {k, 1, 3}]
Output = {{{a, 1}, {b, 2}, {c, 3}}, {{a, 4}, {b, 5}, {c, 6}}, {{a, 7}, {b, 8}, {c, 9}}}

Nu wil ik niet i van 1 tot 3 laten lopen maar van 1 tot 2. Dus:

L4 = Table[Table[{L1[[i]], L2[[k]][[i]]}, {i, 1, 2}], {k, 1, 3}]
Output = {{{a, 1}, {b, 2}}, {{a, 4}, {b, 5}}, {{a, 7}, {b, 8}}}

Kan ik dit ook 'eleganter' doen?

Dus zoiets:

L4 = Table{L3[[i]], {i, 1, 2}]

Bovenstaande werkt niet, want die code geeft gewoon de eerste twee lijstjes van L3 weer. Maar misschien is het iets in die richting?

Veranderd door Lapzwans, 03 mei 2009 - 15:50


#20

Phys

    Phys


  • >5k berichten
  • 7556 berichten
  • VIP

Geplaatst op 03 mei 2009 - 16:05

Ik weet niet precies wat je bedoelt met 'eleganter'. Als je het gewenste resultaat wilt krijgen door een bewerking te doen op L3, dan werkt
Drop[L3, 0, -1]
Output = {{{a, 1}, {b, 2}}, {{a, 4}, {b, 5}}, {{a, 7}, {b, 8}}}
(op het eerste niveau verander je niets, op het tweede niveau - dus in elk van de drie lijstjes - laat je de laatste vallen)
Never express yourself more clearly than you think.
- Niels Bohr -

#21

Lapzwans

    Lapzwans


  • >100 berichten
  • 145 berichten
  • Ervaren gebruiker

Geplaatst op 03 mei 2009 - 16:33

Nou, één van de criteria voor mijn verslag is Mathematica zo simpel en elegant mogelijk gebruiken. Dus als een commando een stuk korter kan, is dat beter. Jouw antwoord is dus perfect.

Nog één vraagje (echt). Zelfde plaatje weer als boven:

Geplaatste afbeelding

Ik heb dus L2 = Drop[L1, 0, -1] bijvoorbeeld. Nu wil ik deze L2 gaan fitten. In plaats van nu te schrijven:
fit1 = Table[Regress[L2[[i]], x, x, RegressionReport -> {BestFit}], {i, 1, 2}];

Kan het ook simpeler? Bijvoorbeeld zoiets als:

L2 = Drop[L1, 0, -1];
fit1 = Replace[fit, L1 -> L2]

Veranderd door Lapzwans, 03 mei 2009 - 16:34


#22

Phys

    Phys


  • >5k berichten
  • 7556 berichten
  • VIP

Geplaatst op 03 mei 2009 - 16:54

Nee, dat kan niet zo direct. Wat wel kan, is het volgende (merk trouwens op dat bij bovenstaande L2 de regressie een foutmelding oplevert vanwege het kleine aantal elementen, maar ik neem aan dat je met veel grotere aantallen werkt):

Definieer een functie fit[Li_] die afhangt van de lijst die je erin stopt:
fit2[Li_]:=Table[Regress[Li[[i]], x, x, RegressionReport -> {BestFit}], {i, 1, 2}];
Als je nu twee lijsten hebt
L1 = {{{1, 2}, {2, 4}, {3, 5}, {5, 6}}, {{1, 3}, {2, 3}, {3, 5}, {6, 7}}};
L2 = Drop[L3, 0, -1]
Verborgen inhoud
(ik heb ze iets langer gemaakt wegens die foutmelding)

dan kun je ze beide fitten met hetzelfde commando:
fit2[L1]
fit[L2]

Als dit bevalt, kun je het zelfs nog iets meer automatiseren (ik weet niet met hoeveel van deze lijsten je werkt).
lists = {L1, L2};
Table[fit2[lists[[i]]], {i, 1, 2}]
output={{{BestFit -> 1.65714+ 0.942857 x}, {BestFit -> 1.92857+ 0.857143 x}}, {{BestFit -> 0.666667+ 1.5 x}, {BestFit -> 1.66667+ 1. x}}}
zodat beide lijsten in een keer worden gefit, en de uitkomst in éen tabel komt te staan.
Never express yourself more clearly than you think.
- Niels Bohr -

#23

Lapzwans

    Lapzwans


  • >100 berichten
  • 145 berichten
  • Ervaren gebruiker

Geplaatst op 03 mei 2009 - 18:50

Bedankt voor alle moeite, je hebt me erg geholpen.

#24

Lapzwans

    Lapzwans


  • >100 berichten
  • 145 berichten
  • Ervaren gebruiker

Geplaatst op 04 mei 2009 - 19:52

Nu heb ik nog een vraagje. Ik heb weer twee lijstjes

L1 = {{1, 2, 3, 4, 5}, {4, 5, 6, 7, 8}, {7, 8, 9, 10, 11}, {10, 11, 12, 13, 14}}
L2 = {{1,2}, {2, 2}, {3, 3}, {3, 4}, {4, 5}}

Nu zijn de getallen in L2 de coefficienten {a, b} van de functie y = a + b(x - 5) en ik wil berekenen:

LaTeX

Dus ik moet dit krijgen voor het eerste sublijstje van L3:

LaTeX = {{1 - (1 + 2(1 -5)}, {2 - (1 + 2(2 - 5)}, {3 - (1 + 2(3 - 5)}, {4 - (1 + 2(4 - 5)}, {5 - (1 +2(5 - 5)}} = {{8}, {7}, {6}. {5}, {4}}

Het eerste sublijstje uit L1 hoort dus bij het eerste sublijstje uit L2. De x loopt van 1-5, oftewel het aantal elementen in zo'n sublijstje van L1.

Ik snap het zelf al bijna niet meer, maar kan iemand hier iets mee?

Edit: Die coëfficiënten komen uit een regressie, misschien dat het makkelijker kan?

Veranderd door Lapzwans, 04 mei 2009 - 19:57


#25

Phys

    Phys


  • >5k berichten
  • 7556 berichten
  • VIP

Geplaatst op 04 mei 2009 - 20:32

Ik begrijp er niet zoveel van. Ten eerste: L1 en L2 bestaan niet uit even veel elementen (4 resp. 5), dat kan toch niet?

\\edit: ok, laten we er even vanuit gaan dat L1 en L2 wél even groot zijn. Dus stel
L1 = {{1, 2, 3, 4, 5}, {4, 5, 6, 7, 8}, {7, 8, 9, 10, 11}, {10, 11, 12, 13, 14}};
L2 = {{1, 2}, {2, 2}, {3, 3}, {3, 4}};
Volgens mij wil jij nu het volgende:
y[a_, b_, x_] = a + b (x - 5);
L3=Table[L1[[i]] - Table[y[L2[[i]][[1]], L2[[i]][[2]], x], {x, 1, 5}], {i, 1, Length[L1]}]

Dit geeft als output:
{{8, 7, 6, 5, 4}, {10, 9, 8, 7, 6}, {16, 14, 12, 10, 8}, {23, 20, 17, 14, 11}}
Never express yourself more clearly than you think.
- Niels Bohr -

#26

Lapzwans

    Lapzwans


  • >100 berichten
  • 145 berichten
  • Ervaren gebruiker

Geplaatst op 04 mei 2009 - 21:29

Dat is precies wat ik zocht! Stom van me dat ik je verwarde door L1 en L2 niet even groot te maken, maar evengoed knap dat je eruit kwam.

#27

Phys

    Phys


  • >5k berichten
  • 7556 berichten
  • VIP

Geplaatst op 04 mei 2009 - 21:46

Mooi! Ik hoor het wel als je nog vragen hebt ;)
Never express yourself more clearly than you think.
- Niels Bohr -

#28

Lapzwans

    Lapzwans


  • >100 berichten
  • 145 berichten
  • Ervaren gebruiker

Geplaatst op 05 mei 2009 - 02:23

Dit heeft niet echt iets met lijstjes meer te maken, maar misschien dat je kunt helpen.
Ik heb een lijstje met maandelijkse temperaturen over een periode van 5 jaar van 2000-2004, dus 120 waarden in totaal. Elke maand heeft dus ook vijf meetwaarden. Ik heb ze als volgt in een lijstje staan:

T = {{1, 2, 2, 1, 1}, {2, 2, 3, 4, 3}, ...... {1, 3, 2, 3, 1}}

Het eerste element {1, 2, 2, 1, 1} is alle meetwaarden van januari van 2000-2004, het tweede van februari, enz. Nu wil ik al deze gegevens graag chronologisch plotten. Met ListPlot lukt dit wel eenvoudig:

ListPlot[T, PlotRange -> All]

Alleen dan hou ik als x-as wel 1-5 en niet 2000-2004. Weet jij hoe ik de x-as kan hernoemen zodat hij bij 2000 begint in de oorsprong?

#29

Phys

    Phys


  • >5k berichten
  • 7556 berichten
  • VIP

Geplaatst op 05 mei 2009 - 12:52

Gebruik DataRange:
ListPlot[T, PlotRange -> All, DataRange -> {2000, 2004}]

Verborgen inhoud

Dit heeft niet echt iets met lijstjes meer te maken (...)
Ik heb een lijstje...

;)
Never express yourself more clearly than you think.
- Niels Bohr -

#30

Lapzwans

    Lapzwans


  • >100 berichten
  • 145 berichten
  • Ervaren gebruiker

Geplaatst op 05 mei 2009 - 14:01

Dank je. Nog een vraagje ;)

T = {{-1, -2, -2, -1, 1}, {-2, 2, -3, -4, -3}, {2, 2, 3, 4, 3}, {8, 7, 9, 11, 12}, {15, 12, 13, 14, 15}, {18, 17, 20, 22, 21}, {21, 22, 20, 21, 21}, {20, 21, 23, 24, 21}, {16, 15, 15, 16, 17}, {11, 12, 12, 11, 12}, {7, 5, 3, 4, -3}, {-1, 3, -2, -3, -1}}

Dit is weer hetzelfde lijstje, alleen nu heb ik alle (verzonnen) meetwaarden erin gezet (en het zijn er natuurlijk 60, niet 120 zoals ik eerst schreef). Het eerste element is weer januari, tweede alle meetwaarden van februari, etc.

Nu wil ik een tabel maken met de drie maanden die het verst boven de x-as liggen (warmste) en een tabel met de drie maanden die het verst onder de x-as liggen (koudste). Wat ik in principe dus wil doen is denk ik de drie elementen met het kleinste gemiddelde vinden en de drie elementen met het grootste gemiddelde. Weet jij hoe dat kan?





0 gebruiker(s) lezen dit onderwerp

0 leden, 0 bezoekers, 0 anonieme gebruikers

Ook adverteren op onze website? Lees hier meer!

Gesponsorde vacatures

Vacatures