用于将环路方程转换为倍频程的Matlab代码

用于将环路方程转换为倍频程的Matlab代码,matlab,function,for-loop,octave,Matlab,Function,For Loop,Octave,我使用的是octave 3.8.1,它的工作原理类似于matlab 我有一个由数千个值组成的数组,以下仅包括三个分组作为示例: (amp1=0.2;freq1=3;phase1=1;是一个分组的示例) 下面的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 ((a

我使用的是octave 3.8.1,它的工作原理类似于matlab

我有一个由数千个值组成的数组,以下仅包括三个分组作为示例:

(amp1=0.2;freq1=3;phase1=1;是一个分组的示例)

下面的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循环中,该循环将在一组n组中工作:

如果我想找到freq=2.5和amp=0.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
下面是公式的图像:

如果给定频率和安培值,我想检查/计算相位

我知道我必须做一个for循环,但是我如何将相位方程转换成for循环,这样它将在数组中的n个分组上工作,并计算数组中未找到的不同值


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

好的,我想我终于理解了您的问题:

  • 您试图找到一组
    phase1
    phase2
    ,…,
    phaseN
    ,以便满足您描述的方程
  • 您知道如何查找
    y
    ,并为
    freq
    amp
    提供值
  • 在Matlab中,这样的问题可以使用,例如
    fsolve
    来解决,但是让我们一步一步来看看您的问题
为了简单起见,让我重新编写
phase1
phase2
phase3
的方程式。例如,您的第一个等式,即
phase1
,将为

amp1*cos(相位1+2freq1pit)+amp2*cos(2freq2pit+phase2)+amp3*cos(2freq3pit+phase3)-y=0

注意,
ampX
X
1
2
3
)是给定的,
pi
是一个常数,
t
是通过
Y
(我想)给出的,
freqX

因此,事实上,你们正在处理一个非线性的向量方程

F(相位)=0

其中,
F
是一个多维(向量)函数,采用多维(向量)输入变量
相位
(包括
相位1
相位2
,…,
相位
)。你在寻找一组相量,向量函数的所有分量都是零。注意
F
是您的功能的缩写。因此,
F
的第一个组件,例如称为
f1
,是

f1=amp1*cos(相位1+…)+amp2*cos(相位2+…)+amp3*cos(相位3+…)-y=0

因此,
f1
phase1
phase2
phase3
的一维函数

你要做的技术术语是找到一个非线性向量函数的零点,或者找到一个非线性向量函数的解。在Matlab中,有不同的方法

对于一维函数,可以使用
fzero
,这在

对于像您这样的多维(向量)函数,我将研究如何使用
fsolve
,这是Matlab优化工具箱的一部分(这意味着我不知道如何在倍频程中实现这一点)。有关函数
fsolve
的说明,请参见

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

特别是,我建议您研究牛顿方法,它允许您找到方程组
F
的解。维基百科对牛顿的方法有很好的解释。牛顿迭代非常容易实现,你应该在网上找到很多资源。您必须计算函数
F
对每个变量
phaseX
的导数,这非常容易计算,因为您只处理
cos()
函数。首先,请看一下Matlab中的一维牛顿迭代法

最后,如果你想更深入地挖掘,我从工业和应用数学学会找到了一本关于这个主题的教科书:

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

祝你好运

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