用于将环路方程转换为倍频程的Matlab代码
我使用的是octave 3.8.1,它的工作原理类似于matlab 我有一个由数千个值组成的数组,以下仅包括三个分组作为示例: (amp1=0.2;freq1=3;phase1=1;是一个分组的示例) 下面的Octave/Matlab代码求解Y,因此我可以将其插入到方程中,以检查值以及不在数组中的计算值用于将环路方程转换为倍频程的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
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