2015-08-08 107 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

正如你所看到的,这是一个非常大的领域;不过,牛顿的方法应该可以帮助你。

祝你好运!