2017-05-03 332 views
0

我已經在C++中計算了係數an,bn(100,T = 2 * pi)並且使用少量源檢查它們是否正確。現在我嘗試產生用於給定的示例性函數的傅里葉級數圖表中的Scilab傅立葉級數圖生成從給定的係數an,bn在Matlab(Scilab)

(X + 2)* ABS(COS(2 * X *(X-π/ 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) 

下面是結果:(?反轉)

enter image description here

它清楚地看這種趨勢是確定的,但開始和期末是錯誤的。 您是否在Scilab代碼中看到任何問題?什麼會導致問題 - 函數解(x)中sin/cos的值?我應該提供一個bn值並檢查那裏的錯誤計算嗎?

+0

你已經解決了這個問題嗎? – Attila

回答

1

我不知道你們是怎麼計算的A & B係數,但我假設你使用了常用的記號,以獲得下式的第一行:

equation

因此n從1開始。由於Scilab從1開始向量索引,因此您已從2正確地創建了循環,但忘記補償此「偏移」。 你的函數應該是這樣的:

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 

因爲你沒提供A & B,我不能檢查結果。

附加說明:在語法上更正確的,如果你明確地定義一個函數的所有輸入變量,就像這樣:

function series=solution(x,A,B) 

這樣你可以肯定的是,在你的代碼輸入不改變其他地方。

+0

謝謝,你是完全正確的,我發現「我-1」:)現在近似幾乎相同的功能:) – gooornik07