Springen naar inhoud

[wiskunde] benadering dmv chebyshev veeltermen


  • Log in om te kunnen reageren

#1

LiesbethDN

    LiesbethDN


  • >25 berichten
  • 96 berichten
  • Ervaren gebruiker

Geplaatst op 01 december 2008 - 17:31

Ik ben bezig met het programmeren van een benadering voor een bepaalde functie dmv chebyshev veeltermen in MATLAB, en ik krijg een error waarvan ik wel begrijp wat hij bedoelt, maar waarvan ik niet begrijp dat hij op die plaats voorkomt.

Hier mijn code :
[codebox]function benadering = oefening3(k)

theta = linspace(1, 2*pi, k+1);
vierkant = f_theta(theta);

z = zeros(1, k+1);
som = zeros(1,k+1);
coef = zeros(1,k+1);

for j = 1 : k + 1
z(j) = (theta(j) - (theta(1) + theta(k+1))/2)/((theta(k + 1) - theta(1))/2);
end

for i = 1 : k + 1
if ((0 <= theta(i)) && (theta(i) < pi/4))
functie = @(theta) sqrt(1 + (tan(theta)).^2).*chebyshev(k,z)./sqrt(1 - theta.^2);
elseif ((3*pi/4 <= theta(i)) && (theta(i) < 5*pi/4))
functie = @(theta) sqrt(1 + (tan(theta)).^2).*chebyshev(k,z)./sqrt(1 - theta.^2);
elseif((7*pi/4 <= theta(i)) && (theta(i) <= 2*pi))
functie = @(theta) sqrt(1 + (tan(theta)).^2).*chebyshev(k,z)./sqrt(1 - theta.^2);
elseif ((pi/4 <= theta(i)) && (theta(i) < 3*pi/4))
functie = @(theta) sqrt(1 + (cot(theta)).^2).*chebyshev(k,z)./sqrt(1 - theta.^2);
elseif ((5*pi/4 <= theta(i)) && (theta(i) < 7*pi/4))
functie = @(theta) sqrt(1 + (cot(theta)).^2).*chebyshev(k,z)./sqrt(1 - theta.^2);
end

coef(i) = quad(functie, -1, 1);
end

for i = 1 : k + 1
som(i) = som(i) + coef(i).*chebyshev(i,theta(i));
end

benadering = coef(1)/2 + som(k+1);[/codebox]

Ik krijg een error in de if-structuur vanaf wanneer ik de cotangens ipv de tangens gebruik. De error die ik krijg is dat de dimensies van mijn matrices niet kloppen. Maar waarom kloppen ze daar dan niet, en in de regels daarboven met de tangens dan wel ?

De functie chebyshev die erin voorkomt is trouwens een functie die ik zelf geschreven heb die de k-de chebyshev van een interval z berekend. Hierin is niets fout want deze heb ik al meerdere keren succesvol gebruikt.

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

#2

EvilBro

    EvilBro


  • >5k berichten
  • 6703 berichten
  • VIP

Geplaatst op 01 december 2008 - 23:54

... ik krijg een error waarvan ik wel begrijp wat hij bedoelt, maar waarvan ik niet begrijp dat hij op die plaats voorkomt.

Je geeft de exacte error echter niet. Hierdoor is het lastig om te zien wat de error is en waar hij gegenereerd wordt. Ik zie echter wel een paar dingen waarvan ik denk dat het op zijn minst onhandig is (en misschien mag het niet).

if ((0 <= theta(i)) && (theta(i) < pi/4)) 
  functie = @(theta) sqrt(1 + (tan(theta)).^2).*chebyshev(k,z)./sqrt(1 - theta.^2);
Je gebruikt hier 'theta' voor zowel een vector als een functievariabele. Als dit al mag, leidt dit tot onleesbaarheid en verwarring. Je zou bijvoorbeeld kunnen gaan denken dat 'theta' in de functie de waarde van 'theta(i)' heeft. Dit is niet het geval.

Wat je ook niet moet vergeten is dat theta (de vector) begint bij 1. Dit zorgt er dus voor dat bij i=1 je in dit stukje code komt:
elseif ((pi/4 <= theta(i)) && (theta(i) < 3*pi/4)) 
		functie = @(theta) sqrt(1 + (cot(theta)).^2).*chebyshev(k,z)./sqrt(1 - theta.^2);
Precies het stukje code waarbij jij zegt dat er een fout optreedt. Ik vermoed dus dat als je de waarde van i bekijkt dat je vindt dat deze de waarde 1 heeft. De eerdere if-clauses doen het dus helemaal niet. Ze worden gewoon niet aangeroepen.

#3

LiesbethDN

    LiesbethDN


  • >25 berichten
  • 96 berichten
  • Ervaren gebruiker

Geplaatst op 02 december 2008 - 14:01

De fout zal hem inderdaad gezeten hebben in het kiezen van mijn variabelen.
Ik heb de theta(i) in mijn if-clause laten staan, en de theta's in mijn functievoorschrift veranderd naar z.
Nu voert MATLAB alles uit zonder werkelijke errors maar ik krijg wel volgende waarschuwing :

Warning: Infinite or Not-a-Number function value encountered. (4x, ik veronderstel voor iedere if keuze 1x).

Door deze waarschuwing krijg ik dan waarschijnlijk ook geen grafiek te zien in het interval dat ik wou plotten, omdat er waarschijnlijk geen grafiek is omdat al mijn waarden waarschijnlijk oneindig zijn.

Ik zie toch niet in wat er nu fout gaat ...

Voor de duidelijkheid misschien nog eventjes mijn nieuwe code :

[codebox]function benadering = oefening3(k)

theta = linspace(1, 2*pi, k+1);
vierkant = f_theta(theta);

z = zeros(1, k+1);
som = zeros(1,k+1);
coef = zeros(1,k+1);

for j = 1 : k + 1
z(j) = (theta(j) - (theta(1) + theta(k+1))/2)/((theta(k + 1) - theta(1))/2);
end

for i = 1 : k + 1
if ((0 <= theta(i)) && (theta(i) < pi/4))
functie = @(z) sqrt(1 + (tan(z)).^2).*chebyshev(k,z)./sqrt(1 - z.^2);
elseif ((3*pi/4 <= theta(i)) && (theta(i) < 5*pi/4))
functie = @(z) sqrt(1 + (tan(z)).^2).*chebyshev(k,z)./sqrt(1 - z.^2);
elseif((7*pi/4 <= theta(i)) && (theta(i) <= 2*pi))
functie = @(z) sqrt(1 + (tan(z)).^2).*chebyshev(k,z)./sqrt(1 - z.^2);
elseif ((pi/4 <= theta(i)) && (theta(i) < 3*pi/4))
functie = @(z) sqrt(1 + (cot(z)).^2).*chebyshev(k,z)./sqrt(1 - z.^2);
elseif ((5*pi/4 <= theta(i)) && (theta(i) < 7*pi/4))
functie = @(z) sqrt(1 + (cot(z)).^2).*chebyshev(k,z)./sqrt(1 - z.^2);
end

coef(i) = quad(functie, -1, 1);
end

for i = 1 : k + 1
som(i) = som(i) + coef(i).*chebyshev(i,theta(i));
end

benadering = coef(1)/2 + som(k+1);[/codebox]

#4

EvilBro

    EvilBro


  • >5k berichten
  • 6703 berichten
  • VIP

Geplaatst op 02 december 2008 - 15:29

Ik heb de theta(i) in mijn if-clause laten staan, en de theta's in mijn functievoorschrift veranderd naar z.

Je dacht: 'laat ik maar een andere variabele naam gebruiken die ik al heb'? :D

Warning: Infinite or Not-a-Number function value encountered. (4x, ik veronderstel voor iedere if keuze 1x).

Je hebt 5 if-statements. Zet eens een breekpunt en ga een stap voor stap door je code heen. Op die manier kun je precies zien waar de fout gegenereerd wordt (ik vermoed dat het fout gaat als z = 1 of -1).

#5

LiesbethDN

    LiesbethDN


  • >25 berichten
  • 96 berichten
  • Ervaren gebruiker

Geplaatst op 02 december 2008 - 16:54

Ik had vijf identieke errors, ik had fout geteld :D

Ik ga eventjes proberen met het plaatsen van breekpunten.

Maakt het eigenlijk (qua functionaliteit, niet qua leesbaarheid) uit of ik de variabele z of een andere variabele zou gebruiken ? Ik dacht dat het een variabele moest zijn die ik al eens gebruikt had en die een bepaalde waarde had, om die Chebyshev-veeltermen kunnen uit te rekenen.

#6

LiesbethDN

    LiesbethDN


  • >25 berichten
  • 96 berichten
  • Ervaren gebruiker

Geplaatst op 02 december 2008 - 17:34

Ik heb nog een foutje ontdekt in mijn code. Ik had een interval voor theta aangemaakt gaande van 1 tot 2pi maar dat moest natuurlijk van 0 tot 2pi zijn.
Na dit veranderd te hebben, heb ik maar 2 waarschuwingen niet meer, waarschijnlijk eentje voor z = -1 en een voor z = 1.
Ik weet echter niet goed hoe ik deze waarde kan uitsluiten om mijn integraal te berekenen.





0 gebruiker(s) lezen dit onderwerp

0 leden, 0 bezoekers, 0 anonieme gebruikers

Ook adverteren op onze website? Lees hier meer!

Gesponsorde vacatures

Vacatures