[wiskunde] benadering dmv chebyshev veeltermen

Moderators: ArcherBarry, Fuzzwood

Reageer
Berichten: 96

[wiskunde] benadering dmv chebyshev veeltermen

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 :

Code: Selecteer alles

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);
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.

Berichten: 7.068

Re: [wiskunde] benadering dmv chebyshev veeltermen

... 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).

Code: Selecteer alles

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:

Code: Selecteer alles

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.

Berichten: 96

Re: [wiskunde] benadering dmv chebyshev veeltermen

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 :

Code: Selecteer alles

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);

Berichten: 7.068

Re: [wiskunde] benadering dmv chebyshev veeltermen

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).

Berichten: 96

Re: [wiskunde] benadering dmv chebyshev veeltermen

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.

Berichten: 96

Re: [wiskunde] benadering dmv chebyshev veeltermen

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.

Reageer