2017-05-03 6 views
0

J'ai calculé les coefficients an, bn (100, T = 2 * pi) en C++ et vérifié qu'ils sont corrects en utilisant peu de sources. Maintenant, je tente de générer le graphique de la série de Fourier de la fonction d'exemple donné dans Scilab:Génération de graphe de séries de Fourier à partir de coefficients donnés an, bn dans Matlab (Scilab)

(x + 2) * abs (cos (2 * x * (x-pi/6)))

M=csvRead(filename, ";", [], 'double') 
n=size(M,1) 

for i = 1:n 
    A(i)=M(i) 
    B(i)=M(i + n) 
end 

function series=solution(x) 
    series=A(1)/2; 
    for i = 2:n 
     series=series+(A(i)*cos(i*x)+B(i)*sin(i*x)); 
    end 
endfunction 

function series=solution2(x) 
    series=(x+2).*abs(cos(2.*x.*(x-%pi/6))); 
endfunction 

x = -%pi:%pi/100:%pi 
plot2d(x, solution(x), 3) 

x2 = -%pi:%pi/100:%pi 
plot2d(x2, solution2(x2), 4) 

Voici le résultat: (inversé)

enter image description here

Il semble bien que la tendance est ok mais sont mal le début et la fin de la période. Voyez-vous des problèmes dans le code Scilab?Ce qui pourrait causer le problème - valeurs dans sin/cos dans la solution de fonction (x)?Devrais-je fournir des valeurs de, bn et vérifier qu'il n'y a pas de calcul erroné?

+0

Avez-vous déjà résolu ce problème? – Attila

Répondre

1

Je ne sais pas comment avez-vous calculé vos A & coefficients B, mais je suppose que vous avez utilisé les notations habituelles pour obtenir la première ligne de la formule suivante:

equation

Ainsi n commence à partir de 1. Depuis que Scilab démarre l'indexation vectorielle à partir de 1, vous avez correctement fait votre boucle à partir de 2, mais vous avez oublié de compenser ce "décalage". Votre fonction doit être quelque chose comme ceci:

function series=solution(x) 
    series=A(1)/2; 
    for i = 2:n 
     series=series+(A(i)*cos((i-1)*x)+B(i)*sin((i-1)*x)); 
    end 
endfunction 

Puisque vous n'avez pas fourni A & B, je ne peux pas vérifier le résultat.

Note complémentaire: Syntaxiquement plus correct si vous définissez explicitement toutes les variables d'entrée dans une fonction, comme ceci:

function series=solution(x,A,B) 

De cette façon, vous pouvez être sûr que votre entrée ne change pas ailleurs dans le code.

+0

Merci, vous avez tout à fait raison, j'ai trouvé que "i-1" :) Maintenant, l'approximation est presque identique à la fonction :) – gooornik07