Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

Matlab: zelfde code, ander resultaat

Pagina: 1
Acties:

  • kamustra
  • Registratie: November 2006
  • Niet online
Voor school moeten we een opdracht maken (een raamwerk analyseren) en daarvoor gebruiken de toolbox STABIL van Matlab. Na lang prutsen gaf mijn inputbestand nog steeds een fout resultaat (totaal verkeerde grootteorde). De input is zowel nagekeken door ons als door de assistent, we vinden de fout niet. Alle invoergegevens kloppen, zowel qua definitie, syntax, grootteorde, ...
De moed bijna opgevend proberen we het een laatste keer, met nog steeds hetzelfde invoerbestand, maar dit keer op de computers van de school en warempel :o Het werkt :o Alles lijkt te kloppen, de uitvoer heeft de juiste grootteorde, is logisch, ...
Erg vreemd dus, enerzijds blij dat het niet aan het inputbestand ligt. Maar natuurlijk is nu de vraag waar het dan wel aan ligt, en belangrijker, hoe ik ervoor zorg dat op mijn laptop toch de juiste resultaten bekomen worden.
Het invoerbestand is dus exact hetzelfde.
OS: Win 8.1 64 bit (laptop) vs Win 7 64 bit (school)
Toolbox: STABIL, correct ingeladen in beide gevallen
Matlab: 2013b (laptop) vs 2012a of 2013a (ik heb nagevraagd welke op de betreffende pc staat) (school)

Ik heb al gezocht op het forum, daar vind ik dat het aan de Matlabversie zou kunnen liggen, zodra ik antwoord heb van de IT-dienst welke versie op school draait probeer ik die ook eens.
Zijn er nog andere dingen waar dit aan kan liggen?

Misschien nog een detail, ik weet niet of het belangrijk is: in beide gevallen krijg ik de melding "Warning: matrix is singular to working precision"; in beide gevallen rekent Matlab verder en wordt er wel een uitkomst getoond. Ook de machinenauwkeurigheid (met "eps()") is gelijk in beide gevallen.

  • SmiGueL
  • Registratie: September 2005
  • Laatst online: 22-11 22:47
Verschilt de matrix die de warning message geeft ook van de matrix waarbij hij geen error geeft?

[ Voor 4% gewijzigd door SmiGueL op 14-11-2013 14:48 ]

Delidded 4770K 4.7GHz @ H220 || Gigabyte Z87X-UD4H || 16GB @ 2400MHz || Gigabyte GTX 760 || 2x128GB Samsung 830 @ RAID-0 & WD 3 TB || Iiyama XB2483HSU-B1 || Synology DS916+ 3x6TB + 120GB SSD Cache || Synology DS213+ 6TB backup


  • kamustra
  • Registratie: November 2006
  • Niet online
Ik gebruik U=K\P om U te berekenen uit K en P. (De theoretische formule hierachter is K*U=P). K en P worden ervoor samengesteld en deze zijn in beide gevallen gelijk.
Na het commando U=K\P krijg ik deze waarschuwing, U verschilt in beide gevallen.

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Programming FAQ - Debuggen: hoe doe ik dat?

Hoogstwaarschijnlijk is er toch net wat anders aan je omgeving, en is het achteraf best logisch waar het mis gaat. Probeer dus eens stap voor stap te debuggen om te kijken waar er verschil optreed.

[ Voor 5% gewijzigd door Woy op 14-11-2013 15:00 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • EnnaN
  • Registratie: September 2002
  • Laatst online: 21-11 11:24

EnnaN

Toys in the attic

Geen idee wat voor waarden je mee werkt, maar als het verschillend is qua omgeving en je krijgt ook ordegrootte problemen _kan_ (maar dit is dus glazenbolkunde) het eventueel aan de taal (locale) instellingen liggen? Dat je dus een duizendtalscheiding hebt waar je een decimaalscheiding verwacht, of andersom, omdat '.' en ',' andere betekenis hebben? Just a thought, niet superwaarschijnlijk, maar toch :)

sig


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
@EnnaN, het lijkt me niet eens een gekke verklaring, maar dat zou je dus zou uitvinden als je gaat debuggen.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • kamustra
  • Registratie: November 2006
  • Niet online
@EnnaN: Nee, daar hadden we zelf ook aan gedacht, maar daar zit het probeem niet. In beide gevallen wordt een . als decimaalscheiding gebruikt en geen duizendtalscheiding. Er zit in hele bestand geen komma.

@Woy: Daar ga ik dan eens mee aan de slag.

  • jpiwf
  • Registratie: Mei 2003
  • Laatst online: 13:12

jpiwf

licenced pepernootaddict

kamustra schreef op donderdag 14 november 2013 @ 14:57:
Ik gebruik U=K\P om U te berekenen uit K en P. (De theoretische formule hierachter is K*U=P). K en P worden ervoor samengesteld en deze zijn in beide gevallen gelijk.
Na het commando U=K\P krijg ik deze waarschuwing, U verschilt in beide gevallen.
Zijn K en P in dit geval matrices? Want het zou zomaar kunnen zijn dat de verschillende versies van matlab deze op een andere manier behandelen. In matrixrekenen is de uitkomst van een matrix A gedeeld door een andere matrix B namelijk niet hetzelfde als B/A. De volgorde maakt uit, en niet elke vermenigvuldiging is om te draaien door een deling.

member of Los Alcoholicos ban dhmo


  • kamustra
  • Registratie: November 2006
  • Niet online
Ja klopt, zijn beide matrices. De omzetting K*U=P naar U=K\P komt in dit geval uit de hoorcolleges van de prof, en zou dus correct moeten zijn (mijn cursus matrices is alweer een tijdje geleden). Ik weet wel nog dat er een verschil is tussen een forward slash en een backward slash, waarbij die laatste, die ik gebruik, specifiek is om deze vergelijking op te lossen en dus de inverse te berekenen. Desondanks zou het inderdaad kunnen zijn dat de matlabversies hier anders mee omgaan, vandaar dat ik gemailed heb naar de IT-dienst om te weten welke Matlabversie ze hebben.

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
kamustra schreef op donderdag 14 november 2013 @ 15:06:
@EnnaN: Nee, daar hadden we zelf ook aan gedacht, maar daar zit het probeem niet. In beide gevallen wordt een . als decimaalscheiding gebruikt en geen duizendtalscheiding. Er zit in hele bestand geen komma.

@Woy: Daar ga ik dan eens mee aan de slag.
Maar het kan aan de systeeminstellingen liggen hoe daar mee om gegaan word ;)

Een simpele output van K, U en P voor die regel en na die regel zou voldoende moeten zijn om te zien of er verschil in de berekening zit :)

[ Voor 13% gewijzigd door Woy op 14-11-2013 15:18 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • Tijmus
  • Registratie: December 2009
  • Laatst online: 26-11-2021
1. Een singuliere matrix is niet inverteerbaar (dat is de definitie, waarschijnlijk zal je dus ook niet direct de inverse kunnen bereken met inv(A)), wat sowieso tot onnauwkeurige resultaten leidt.
2. De backslash operator is niet een specifieke methode; op basis van bepaalde eigenschappen van de matrix kiest het algoritme de meest geschikte methode (kan best dat daar een verschil in zit bij de twee matlab-versies). Probeer anders gewoon 1 vaste methode (LU of Cholesky oid).

btw.: K*U=P --> inv(K)*K*U=inv(K)*P--> U=inv(K)*P ,wat in Matlab opgelost kan worden als U=K\P

[ Voor 10% gewijzigd door Tijmus op 14-11-2013 16:29 ]


  • kamustra
  • Registratie: November 2006
  • Niet online
Een domme vraag, maar hoe kan ik dat juist zien of aanpassen? Ik heb wat lopen zoeken in de instelling van matlab maar ik zie het niet :$ Die instellingen voor . of , dus

Tijmus: 2: Ik bedoel vooral specifiek om de vergelijking Ax=B op te lossen naar x ;-)
en 1: De matrix is niet singulier. De waarschuwing die Matlab geeft heb ik opgezocht, deze zou zijn omdat de waardes klein worden, maar de matrix is niet singulier. Hij geeft ook weer waarde voor U (of ja, een matrix vol waardes)

[ Voor 56% gewijzigd door kamustra op 14-11-2013 15:45 ]


  • SmiGueL
  • Registratie: September 2005
  • Laatst online: 22-11 22:47
SmiGueL schreef op donderdag 14 november 2013 @ 14:46:
Verschilt de matrix die de warning message geeft ook van de matrix waarbij hij geen error geeft?
kamustra schreef op donderdag 14 november 2013 @ 14:57:
Ik gebruik U=K\P om U te berekenen uit K en P. (De theoretische formule hierachter is K*U=P). K en P worden ervoor samengesteld en deze zijn in beide gevallen gelijk.
Na het commando U=K\P krijg ik deze waarschuwing, U verschilt in beide gevallen.
Ter controle kun je altijd nog kijken of K maal de berekende U gelijk is aan P (dus exact zoals de formule voorschrijft)

Een snelle Google actie leek te wijzen op afrondingsfouten bij heeeel kleine getallen.
(Excel (i.c.m. VBA) doet dit ook af en toe, na wat sommen die op precies 1 uit moeten komen geeft hij als je ze met 16 decimalen weergeeft 1,0000000000000123 aan oid)

Als jij aangeeft dat K en P op beide machines nog gelijk zijn, en na berekening van U er een error optreedt dan misschien kijken of je deze K en P eens met 20 decimalen kan weergeven, en alsnog vergelijken of er een verschil is.
Maar wss is deze error vrij algemeen dus is het toch wat anders.

[ Voor 5% gewijzigd door SmiGueL op 14-11-2013 16:33 ]

Delidded 4770K 4.7GHz @ H220 || Gigabyte Z87X-UD4H || 16GB @ 2400MHz || Gigabyte GTX 760 || 2x128GB Samsung 830 @ RAID-0 & WD 3 TB || Iiyama XB2483HSU-B1 || Synology DS916+ 3x6TB + 120GB SSD Cache || Synology DS213+ 6TB backup


  • Tijmus
  • Registratie: December 2009
  • Laatst online: 26-11-2021
Tijmus: 2: Ik bedoel vooral specifiek om de vergelijking Ax=B op te lossen naar x ;-)
Ja, dat is het hele idee van de backslash operator. Waar het om gaat is dat hij daar verschillende oplossingstechnieken voor heeft, die hij kiest op basis van de eigenschappen van de matrices (dense/sparse/diagonal etc). Het kan dus best zijn dat de gebruikte oplossingstechniek anders is voor de verschillende matlab versies vanwege een verschil in de backslash-functie (of mldivide(), das het hetzelfde).
en 1: De matrix is niet singulier. De waarschuwing die Matlab geeft heb ik opgezocht, deze zou zijn omdat de waardes klein worden, maar de matrix is niet singulier. Hij geeft ook weer waarde voor U (of ja, een matrix vol waardes)
Heb je inv(A) dan al geprobeerd (ie. directe inversie van A)?

  • kamustra
  • Registratie: November 2006
  • Niet online
SmiGueL schreef op donderdag 14 november 2013 @ 16:05:
[...]


[...]


Ter controle kun je altijd nog kijken of K maal de berekende U gelijk is aan P (dus exact zoals de formule voorschrijft)
Dit is dus niet het geval, K*U is niet gelijk aan de oorspronkelijk P.
Als jij aangeeft dat K en P op beide machines nog gelijk zijn, en na berekening van U er een error optreedt dan misschien kijken of je deze K en P eens met 20 decimalen kan weergeven, en alsnog vergelijken of er een verschil is.
Maar wss is deze error vrij algemeen dus is het toch wat anders.
Inderdaad, K en P zijn op beide machines volledig gelijk, ook met 20 decimalen.
Heb je inv(A) dan al geprobeerd (ie. directe inversie van A)?
inv(K) geeft dezelfde warning (singular to working precision). De inverse wordt wel berekend en geeft een ijle matrix. Veel elementen die op het eerste zicht nul zijn (niet allemaal), maar wel met verschillende tekens (-0.0000 en 0.0000), wat me doet vermoeden dat deze niet nul zijn maar dit aan de weergaveopties ligt.

Grote kans dus dat het inderdaad aan een verschil in \ ligt tussen de verschillende Matlabversies.

  • Tijmus
  • Registratie: December 2009
  • Laatst online: 26-11-2021
kamustra schreef op donderdag 14 november 2013 @ 16:39:inv(K) geeft dezelfde warning (singular to working precision). De inverse wordt wel berekend en geeft een ijle matrix. Veel elementen die op het eerste zicht nul zijn (niet allemaal), maar wel met verschillende tekens (-0.0000 en 0.0000), wat me doet vermoeden dat deze niet nul zijn maar dit aan de weergaveopties ligt.

Grote kans dus dat het inderdaad aan een verschil in \ ligt tussen de verschillende Matlabversies.
Als K (bijna) singulier is bestaat er geen unieke oplossing; particuliere oplossing kan je dan evt nog vinden met x=pinv(A)*B. Ipv directe factorizatie (backslash, LU, cholesky etc) kan je het ook eens met een iteratieve solver proberen (pcg, bicgstab,gmres etc.).

Overzichtje van de aanwezige solvers:
http://www.mathworks.nl/h...-equations.html#brs10rz-1
Pagina: 1