将循环方程转换为Octave / Matlab代码

时间:2015-08-08 07:22:30

标签: matlab function for-loop octave

我使用octave 3.8.1,它的工作方式与matlab类似。

我有数千个值的数组我在下面只包含了三个分组:

(amp1 = 0.2; freq1 = 3; phase1 = 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

下面的 Octave / Matlab 代码解决了 Y 所以我可以将它重新插入等式中以检查值以及计算值而不是位于阵列中。

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循环中strong> n分组

如果我想找到freq = 2.5和amp = .23并且相位未知<= strong>我在网上找了它,我怎么写等式/ 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 amp 值,我想做一个检查/计算阶段。

我知道我必须进行for循环但是如何将阶段方程式转换为for循环,以便它可以在数组中强 n分组 并计算数组中未找到的不同值

基本上我会得到一组 n分组 freq = 2.5 amp = .23 并使用公式计算< EM>相。注意:freq并不总是在数组中,因此我尝试使用公式计算阶段

1 个答案:

答案 0 :(得分: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

请注意,ampXX1的占位符,23),pi是常量, t是通过Y(我认为)给出的,freqX是给定的。

因此,事实上,你正在处理形式为

的非线性向量方程

F(phase) = 0

其中F是一个多维(向量)函数,它采用多维(向量)输入变量phase(由phase1phase2组成,... 。,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)。函数fsolvehttp://www.mathworks.com/help/optim/ug/fsolve.html

中解释

如果你知道阶段的近似解决方案,你也可以研究迭代的本地方法。

特别是,我建议您查看 Newton的方法,它可以让您找到方程组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

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

祝你好运!