【问题标题】:For loop equation into Octave / Matlab code将循环方程转换为 Octave / Matlab 代码
【发布时间】:2015-10-31 15:59:06
【问题描述】:

我使用的是 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

下面的公式用于计算 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 分组 上工作>并计算数组中没有的不同值

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

【问题讨论】:

    标签: matlab function for-loop octave


    【解决方案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

    请注意,ampXX123 的占位符)是给定的,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进行了解释

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

    特别是,我建议您研究一下牛顿法,它可以让您找到方程组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

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

    祝你好运!

    【讨论】:

      猜你喜欢
      • 2016-07-01
      • 2020-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-02
      • 1970-01-01
      相关资源
      最近更新 更多