2015-08-08 109 views
2

我使用八度3.8.1,它的工作方式像matlab。For循環方程成Octave/Matlab代碼

我有數千值的陣列我只包括三組,如下一個例子:

(AMP1 = 0.2; FREQ1 = 3;階段1 = 1;是一個分組的一個例子)下面

t=0; 
amp1=0.2; freq1=3; phase1=1; %1st grouping 
amp2=1.4; freq2=2; phase2=1.7; %2nd grouping 
amp3=0.8; freq3=5; phase3=1.5; %3rd grouping 

倍頻/Matlab的代碼解決了ý所以可以將它放回方程與不位於我計算值一起檢查值在陣列中。

clear all 
t=0; 
Y=0; 
a1=[.2,3,1;1.4,2,1.7;.8,5,1.5] 
for kk=1:1:length(a1) 
    Y=Y+a1(kk,1)*cos ((a1(kk,2))*t+a1(kk,3)) 
    kk 
end 
Y 

PS:我不是想解決Y的,因爲它已經解決了,我想解決階段

位於下面的公式來計算階段但我不知道如何把它變成一個for循環,將在陣列工作ň分組

如果我想找到freq = 2.5和amp = .23,並且相位未知,我將如何編寫公式/ for循環找到相位我已經在線查看並且可能需要編寫非線性方程式,不知道如何將我想要做的事轉換成這樣的等式。下面式

phase1_test=acos(Y/amp1-amp3*cos(2*freq3*pi*t+phase3)/amp1-amp2*cos(2*freq2*pi*t+phase2)/amp1)-2*freq1*pi*t 
phase2_test=acos(Y/amp2-amp3*cos(2*freq3*pi*t+phase3)/amp2-amp1*cos(2*freq1*pi*t+phase1)/amp2)-2*freq2*pi*t 
phase3_test=acos(Y/amp3-amp2*cos(2*freq2*pi*t+phase2)/amp3-amp1*cos(2*freq1*pi*t+phase1)/amp3)-2*freq2*pi*t 

圖片: image of formula

我想做一次檢查/計算階段,如果給定的一個頻率和安培值。

我知道我必須爲循環做了,但我怎麼了階段公式轉換爲一個循環,因此會在數組ň分組工作,並計算在陣列中沒有發現不同的值

基本上我將給出Ñ分組FREQ = 2.5安培= 0.23,並使用下式的陣列來計算。注意:freq不會總是在數組中,因此我試圖使用公式計算階段

回答

1

好吧,我想我終於明白你的問題:

  • 你正在努力尋找一套phase1phase2,...,phaseN,使得您所描述的等式滿足
  • 您知道如何找到y,並且您提供的值爲freqamp
  • 在Matlab中,這樣的問題可以通過使用例如fsolve來解決,但讓我們一步一步看看你的問題。

爲簡單起見,讓我重新編寫您的等式爲phase1phase2phase3。例如,你的第一個方程,一個用於phase1,會讀

amp1*cos(phase1 + 2 freq1 pi t) + amp2*cos(2 freq2 pi t + phase2) + amp3*cos(2 freq3 pi t + phase3) - y = 0

注意ampXX12一個佔位符,3)給出,pi是一個常數,t通過給予Y(我認爲),freqX給出。

因此,你是,實際上,處理的形式的非線性矢量方程式

F(phase) = 0

其中F是服用多維(向量的多維(向量)函數)輸入變量phase(由phase1,phase2,...,phaseN組成)。並且您正在尋找phaseX的集合,其中的所有的矢量函數F的組成部分都爲零。注: F是您的功能的簡寫。因此,F的第一個組成部分,例如f1,是

f1 = amp1*cos(phase1+...) + amp2*cos(phase2+...) + amp3*cos(phase3+...) - y = 0

因此,f1phase1phase2phase3的一維函數。

的技術術語,你正在嘗試做的是找到一個非線性矢量函數的零,或找到一個非線性矢量函數的解決方案。在Matlab中,有不同的方法。

對於一維功能,您可以使用fzero,這是在http://www.mathworks.com/help/matlab/ref/fzero.html?refresh=true

解釋了多維向量函數是你的,我會考慮使用fsolve,這是Matlab的優化部分工具箱(這意味着我不知道如何在Octave中做到這一點)。功能fsolve解釋如下:http://www.mathworks.com/help/optim/ug/fsolve.html

如果您知道階段的近似解決方案,也可以查看迭代本地方法。

特別是,我建議你看看牛頓方法,它可以讓你找到一個解決方案系統的方程F。維基百科對牛頓法在https://en.wikipedia.org/wiki/Newton%27s_method有很好的解釋。牛頓迭代很容易實現,你應該在網上找到很多資源。您將必須計算您的函數F相對於您的每個變量phaseX的派生值,因爲您只處理cos()函數,所以計算非常簡單。對於初學者,請看一下Matlab中的一維牛頓迭代法http://www.math.colostate.edu/~gerhard/classes/331/lab/newton.html

最後,如果你想深入挖掘,我從工業和應用數學學會的這個話題上找到了一本教科書:https://www.siam.org/books/textbooks/fr16_book.pdf

正如你所看到的,這是一個非常大的領域;不過,牛頓的方法應該可以幫助你。

祝你好運!