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
公式如下:
如果给定 freq 和 amp 值,我想检查/计算相位。
我知道我必须做一个 for 循环,但我如何将 phase 方程转换成 for 循环,这样它就可以在 n groupings 在数组 中计算数组中未找到的不同值?
基本上我会得到一个数组 n groupings and freq=2.5 and amp=.23并用公式计算相位。注意:freq 并不总是在数组中,因此我尝试使用公式计算 phase。
好的,我想我终于明白你的问题了:
- 您正在尝试找到一组
phase1
、phase2
、...、phaseN
,从而满足您所描述的方程式
- 您知道如何查找
y
,并且您提供 freq
和 amp
的值。
- 在 Matlab 中,这样的问题可以使用
fsolve
等方法解决,但让我们逐步查看您的问题。
为简单起见,让我重写 phase1
、phase2
和 phase3
的等式。例如,您的第一个等式,即 phase1
的等式,将显示为
amp1*cos(phase1 + 2 freq1 pi t) + amp2*cos(2 freq2 pi t + phase2) + amp3*cos(2 freq3 pi t + phase3) - y = 0
注意ampX
(X
是1
、2
、3
的占位符),pi
是一个常量,t
通过 Y
给出(我认为),freqX
给出。
因此,您实际上是在处理形式为
的非线性向量方程
F(phase) = 0
其中 F
是一个多维(向量)函数,采用多维(向量)输入变量 phase
(由 phase1
、phase2
、 ...,phaseN
)。您正在寻找 phaseX 的集合,其中矢量函数 F
的 所有 分量都是零。 N.B。 F
是您函数的 shorthand。因此,F
的第一个分量,称为f1
,例如,是
f1 = amp1*cos(phase1+...) + amp2*cos(phase2+...) + amp3*cos(phase3+...) - y = 0
.
因此,f1
是phase1
、phase2
和phase3
的一维函数。
您尝试做的事情的技术术语是找到非线性向量函数的零点,或找到非线性向量函数的解线性向量函数。在 Matlab 中,有不同的方法。
对于一维函数,可以使用fzero
,在http://www.mathworks.com/help/matlab/ref/fzero.html?refresh=true
中有解释
对于像你这样的多维(矢量)函数,我会考虑使用 fsolve
,它是 Matlab 优化工具箱的一部分(这意味着我不知道如何在 Octave 中执行此操作) .函数 fsolve
在 http://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 .
如您所见,这是一个非常大的领域;不过牛顿法应该可以帮到你。
祝你好运!
我使用的是 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
公式如下:
如果给定 freq 和 amp 值,我想检查/计算相位。
我知道我必须做一个 for 循环,但我如何将 phase 方程转换成 for 循环,这样它就可以在 n groupings 在数组 中计算数组中未找到的不同值?
基本上我会得到一个数组 n groupings and freq=2.5 and amp=.23并用公式计算相位。注意:freq 并不总是在数组中,因此我尝试使用公式计算 phase。
好的,我想我终于明白你的问题了:
- 您正在尝试找到一组
phase1
、phase2
、...、phaseN
,从而满足您所描述的方程式 - 您知道如何查找
y
,并且您提供freq
和amp
的值。 - 在 Matlab 中,这样的问题可以使用
fsolve
等方法解决,但让我们逐步查看您的问题。
为简单起见,让我重写 phase1
、phase2
和 phase3
的等式。例如,您的第一个等式,即 phase1
的等式,将显示为
amp1*cos(phase1 + 2 freq1 pi t) + amp2*cos(2 freq2 pi t + phase2) + amp3*cos(2 freq3 pi t + phase3) - y = 0
注意ampX
(X
是1
、2
、3
的占位符),pi
是一个常量,t
通过 Y
给出(我认为),freqX
给出。
因此,您实际上是在处理形式为
的非线性向量方程F(phase) = 0
其中 F
是一个多维(向量)函数,采用多维(向量)输入变量 phase
(由 phase1
、phase2
、 ...,phaseN
)。您正在寻找 phaseX 的集合,其中矢量函数 F
的 所有 分量都是零。 N.B。 F
是您函数的 shorthand。因此,F
的第一个分量,称为f1
,例如,是
f1 = amp1*cos(phase1+...) + amp2*cos(phase2+...) + amp3*cos(phase3+...) - y = 0
.
因此,f1
是phase1
、phase2
和phase3
的一维函数。
您尝试做的事情的技术术语是找到非线性向量函数的零点,或找到非线性向量函数的解线性向量函数。在 Matlab 中,有不同的方法。
对于一维函数,可以使用fzero
,在http://www.mathworks.com/help/matlab/ref/fzero.html?refresh=true
对于像你这样的多维(矢量)函数,我会考虑使用 fsolve
,它是 Matlab 优化工具箱的一部分(这意味着我不知道如何在 Octave 中执行此操作) .函数 fsolve
在 http://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 .
如您所见,这是一个非常大的领域;不过牛顿法应该可以帮到你。
祝你好运!