我正在尝试为Octave写一个.oct函数,给定一个介于-1和1之间的正弦波值,并且正弦波周期返回一个周期长度的正弦波 vector , vector 中的最后一个值为给定的正弦波值。到目前为止,我的代码是:
#include <octave/oct.h>
#include <octave/dColVector.h>
#include <math.h>
#define PI 3.14159265
DEFUN_DLD (sinewave_recreate, args, , "args(0) sinewave value, args(1) is period")
{
octave_value_list retval;
double sinewave_value = args(0).double_value ();
double period = args(1).double_value ();
ColumnVector output_sinewave(period);
double degrees_inc = 360 / period;
double output_sinewave_degrees;
output_sinewave_degrees = asin( sinewave_value ) * 180 / PI;
output_sinewave(period-1) = sin( output_sinewave_degrees * PI / 180 );
for (octave_idx_type ii (1); ii < period; ii++) // Start the loop
{
output_sinewave_degrees = output_sinewave_degrees - degrees_inc;
if ( output_sinewave_degrees < 0 )
{
output_sinewave_degrees += 360 ;
}
output_sinewave( period-1-ii ) = sin( output_sinewave_degrees * PI / 180 );
}
retval(0) = output_sinewave;
return retval;
}
但给出的结果不完整。我的意思是,它有时会非常准确地重现正弦波,而有时它会消失。我只是通过创建一个给定的正弦波,及时获取最后一个值并将其插入函数以随时间推移向后重新创建正弦波,然后比较两者的曲线图来确定这一点。显然我做错了,但是我似乎无法识别出什么。
最佳答案
让我们从一些三角恒等式开始:
sin(x)^2 + cos(x)^2 == 1
sin(x+y) == sin(x)*cos(y) + sin(y)*cos(x)
cos(x+y) == cos(x)*cos(y) - sin(x)*sin(y)
给定点
x
处的正弦和余弦,在预先计算d
和sd = sin(d)
之后,我们可以精确地计算出一步cd = cos(d)
大小后的值:sin(x+d) = sin(x)*cd + cos(x)*sd
cos(x+d) = cos(x)*cd - sin(x)*sd
给定初始正弦值,您可以计算初始余弦值:
cos(x) = sqrt(1 - sin(x)^2)
请注意,有两个可能的解决方案,对应于两个可能的平方根值。另请注意,这些标识中的所有 Angular 均以弧度表示,如果您要返回波浪,
d
必须为负。关于c++ - 在给定单个正弦波值和周期的情况下递归创建正弦波,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3965039/