Springen naar inhoud

[wiskunde] legendreveelterm in matlab


  • Log in om te kunnen reageren

#1

marty830

    marty830


  • 0 - 25 berichten
  • 6 berichten
  • Gebruiker

Geplaatst op 05 april 2009 - 13:39

Hallo,

Ik zit al twee dagen mijn hoofd te breken over de volgende code:

function L = opdracht1(n) %Functie L aanroepbaar in matlab met opdracht1(n) met n = graad van veelterm
if n == 0; %Bij graad 0, L = 0
	L = 1;
elseif n == 1; %Bij graad 1, L = [1 
			   %				  0]
	L = [1 
		 0];
else
	x = zeros (n+1,1) %nulvector creŽren
	k = n/2;
	j = 2*k-n;
	ceil (j);
	m = j - n;
end
if mod(n,2); %mod(m,2): 0 = even, 1 = oneven.
	a = 0 %als m oneven
else %m is even
	a = (((-1)^((n-j)/2))./(2^n).*(factorial(n + j))./((factorial (j)).*(factorial((n+j)/2)).*(factorial((n-j)/2))))
	sum (0,n)
	L = a*(x^j)
end

Deze code wil ik gebruiken om een legendre veelterm Pn(x) te berekenen nadat de gebruiker de code 'opdracht1(n)' invoert. Ik maak hiervoor gebruik van de Rodrigues formule. Het onderscheid tussen een even en oneven resultaat voor n-j is gemaakt omdat de uitkomst van a nul moet zijn, als n-j oneven is. De ceil functie gebruik ik om het getal m af te ronden zodat ik mod kan gebruiken.

Graag wat reacties want ik vermoed dat er heel wat schort aan deze code. Voornamelijk de uitkomst als vector weergeven is een groot probleem. (Hiervoor gebruik ik de functie zeros).

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

#2

TD

    TD


  • >5k berichten
  • 24049 berichten
  • VIP

Geplaatst op 05 april 2009 - 13:46

Welkom op het forum Huiswerk en Practica.

Jij wilt vlot hulp. Dat is alleen goed mogelijk als je daar zelf wat voor doet.

Naast de algemene regels van dit forum hebben we voor dit huiswerkforum een paar speciale regels en tips.
Die vind je in de huiswerkbijsluiter

In die huiswerkbijsluiter staat bijvoorbeeld:

Quote

VAKGEBIED-TAGS
Plaats het vakgebied waarop je vraag betrekking heeft tussen rechte haken in de titel.
bijv: [biologie] of [frans]. Zo blijft dit huiswerkforum overzichtelijk.

Hebben we even voor je gedaan. Denk je er de volgende keer zelf aan?
"Malgré moi, l'infini me tourmente." (Alfred de Musset)

#3

marty830

    marty830


  • 0 - 25 berichten
  • 6 berichten
  • Gebruiker

Geplaatst op 05 april 2009 - 13:48

Sorry, die had ik nog niet gezien. Ik zal er in het vervolg aan denken!

#4

EvilBro

    EvilBro


  • >5k berichten
  • 6703 berichten
  • VIP

Geplaatst op 05 april 2009 - 14:10

Deze code wil ik gebruiken om een legendre veelterm Pn(x) te berekenen nadat de gebruiker de code 'opdracht1(n)' invoert. Ik maak hiervoor gebruik van de Rodrigues formule.

Geef de formule die je gebruikt. Leg vervolgens het algoritme uit dat je wilt gebruiken. Mocht je dan een specifieke vraag hebben dan geven wij wel hulp.

#5

marty830

    marty830


  • 0 - 25 berichten
  • 6 berichten
  • Gebruiker

Geplaatst op 05 april 2009 - 14:29

De formule zit in bijlage bij deze reactie, deze wil ik dus gebruiken om de legendre veeltermen te laten berekenen.

Bijgevoegde afbeeldingen

  • form.jpg

#6

EvilBro

    EvilBro


  • >5k berichten
  • 6703 berichten
  • VIP

Geplaatst op 05 april 2009 - 18:14

Probeer het volgende om te zetten naar werkelijke code:
Maak een vector met alleen maar nullen van de juiste lengte.
Laat de waarde van j lopen van 0 tot n,
	als n-j oneven is, dan doe je niks (want er staat dan toch al een nul in de vector).
	als n-j even is, dan reken je a_j uit en zet deze op de juiste plek in de vector.
geef de uiteindelijke vector terug als het antwoord.

#7

marty830

    marty830


  • 0 - 25 berichten
  • 6 berichten
  • Gebruiker

Geplaatst op 05 april 2009 - 19:00

Bedankt ;) , ben juist met 'for' command beginnen experimenteren.

Dit heb ik:
x = zeros (n+1,1); %nulvector creŽren
for j = 0:n;
if mod(n-j,2)==0;
a(j) = (((-1).^((n - j)/2))./(2^n).*(factorial(n + j))./((factorial (j)).*(factorial((n+j)/2)).*(factorial((n-j)/2))));
end
Alleen vindt ik dus niet hoe ik deze nu op de juiste plaats kan zetten in de vector, zoals jij aanhaalt.

Graag nog met helpende reacties. Ik wil dit mysterie doorgronden :P

EDIT: Kan ik de plaats voor het invoegen ook besturen met j?

Veranderd door marty830, 05 april 2009 - 19:03


#8

marty830

    marty830


  • 0 - 25 berichten
  • 6 berichten
  • Gebruiker

Geplaatst op 05 april 2009 - 19:18

Zou dit werken? Sorry dat ik het niet zelf probeer maar matlab geeft nog wat andere errors.

x = zeros (n+1,1); %nulvector creŽren
for j = 0:n;
if mod(n-j,2)==0;
a(j) = (((-1).^((n - j)/2))./(2^n).*(factorial(n + j))./((factorial (j)).*(factorial((n+j)/2)).*(factorial((n-j)/2))));
L = x(j) + a

#9

marty830

    marty830


  • 0 - 25 berichten
  • 6 berichten
  • Gebruiker

Geplaatst op 05 april 2009 - 19:28

Nogmaals een update:

function L = opdracht1(n) %Functie L aanroepbaar in matlab met opdracht1(n) met n = graad van veelterm
if n == 0; %Bij graad 0, L = 0
	L = 1
elseif n == 1; %Bij graad 1, L = [1 
			   %				  0]
	L = [1; 
		0]
else
x = zeros (n+1,1); %nulvector creŽren
for j = 0:n;
if mod(n-j,2)==0;
a(j) = (((-1).^((n - j)/2))./(2^n).*(factorial(n + j))./((factorial (j)).*(factorial((n+j)/2)).*(factorial((n-j)/2))));
L = x(j) + a
end
end
end
Ik vraag me alleen af hoe ik deze kan laten uitvoeren zonder error. Zolang ik van nul begin te tellen heeft a immers geen oplossing voor de eerste berekening met j=0. Als ik van j = 1 begin te tellen bekom ik voor n=2:

0 1.5000

Dit klopt want het juiste resultaat moet zijn:

-0.5000 0 1.5000

Alleen die nul blokkeert het dus.

Veranderd door marty830, 05 april 2009 - 19:32


#10

EvilBro

    EvilBro


  • >5k berichten
  • 6703 berichten
  • VIP

Geplaatst op 05 april 2009 - 21:57

x(j) is het j-de element van de vector x. Probeer de volgende code eens:
A = [1 2 3]
size(A)
size(A(2))

Als je in Matlab dingen optelt moeten ze dezelfde dimensies hebben. Bekijk de dimensies eens van de volgende statement in je code:
L = x(j) + a





0 gebruiker(s) lezen dit onderwerp

0 leden, 0 bezoekers, 0 anonieme gebruikers

Ook adverteren op onze website? Lees hier meer!

Gesponsorde vacatures

Vacatures