For循环方程转化为Octave/Matlab代码

For loop equation into Octave / Matlab code

我使用的是 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,因为它已经求解了,因为我正在尝试求解相位

下面的公式用于计算 Phase 但我不确定如何将其放入 for 循环中 n 个分组:

如果我想找到 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

公式如下:

如果给定 freqamp 值,我想检查/计算相位。

我知道我必须做一个 for 循环,但我如何将 phase 方程转换成 for 循环,这样它就可以在 n groupings 在数组 中计算数组中未找到的不同值?

基本上我会得到一个数组 n groupings and freq=2.5 and amp=.23并用公式计算相位。注意:freq 并不总是在数组中,因此我尝试使用公式计算 phase

好的,我想我终于明白你的问题了:

  • 您正在尝试找到一组 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

注意ampXX123的占位符),pi是一个常量,t 通过 Y 给出(我认为),freqX 给出。

因此,您实际上是在处理形式为

的非线性向量方程

F(phase) = 0

其中 F 是一个多维(向量)函数,采用多维(向量)输入变量 phase(由 phase1phase2、 ...,phaseN)。您正在寻找 phaseX 的集合,其中矢量函数 F 所有 分量都是零。 N.B。 F 是您函数的 shorthand。因此,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

中有解释

如果您知道阶段的近似解,您还可以研究迭代的局部方法。

特别是,我建议您查看 牛顿法,它可以让您找到方程组 F 的解。维基百科在 https://en.wikipedia.org/wiki/Newton%27s_method . Newton iterations are very simple to implement and you should find a lot of resources online. You will have to compute the derivative of your function F with respect to each of your variables phaseX, which is very simple to compute since you're only dealing with cos() functions. For starters, have a look at the one-dimensional Newton iteration method in Matlab at http://www.math.colostate.edu/~gerhard/classes/331/lab/newton.html 对牛顿法有很好的解释。

最后,如果你想深入挖掘,我从工业与应用数学学会找到了一本关于这个主题的教科书:https://www.siam.org/books/textbooks/fr16_book.pdf .

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

祝你好运!