Matlab,通过将x的每个元素传递给函数来定义y向量

时间:2014-09-18 01:50:54

标签: matlab function vector

我有矢量x = 1:1:100

我的函数sin_N(x, iterations)使用求和技术近似sin(x),迭代次数作为计算总和的项数。 sin_N返回单个数字,该数字是求和的结果。

我想将值x传递给sin_N,以便我得到一个x长度向量,其中每个元素都是求和的下一步。

我认为它看起来像这样(在这种情况下我接近sin(2)):

y2 = sin_N(2, x)

然而,y2最终只是2。

谁能告诉我我做错了什么?

function [sinApprox] = sin_N(sinVal, iters)

newN = sinVal
sinApprox = sinVal
for a=2:iters
    newN = (-1).^(a-1).* abs(newN) .* ((sinVal .^ 2)/((2.*a - 1).*(2.*a-2)))
    sinApprox = sinApprox + newN
end

2 个答案:

答案 0 :(得分:0)

sin_N的功能是对的。 它可以用作sin_N(2,10) - 迭代次数的10倍。

而x是1:100, 你键入sin_N(2,x),MATLAB实际上是这样做的:sin_N(2,x(1)(sin_N,1(x的第一个数字)

你可以把它检查为:将x改为2:100,sin_N(2,x)的答案与sin_N(2,2)相同

所以,也许你应该试试这个:

y = zeros(1, 100);
for x = 1:100
   y(x) = sin_N(2, x)
end

答案 1 :(得分:0)

这不起作用的原因是因为您的功能仅设计为输出一个数字。如果要在每次迭代时输出值,则需要在函数内部声明向量,然后在函数内的每次迭代中,将此迭代的值分配给您的相应位置。功能。当前迭代与上一次迭代有关,但您在系列中添加下一个术语。 FWIW,您实际上正在计算Maclaurin series近似sin

因此,请尝试这样的事情:

function [sinApprox] = sin_N(sinVal, iters)

newN = sinVal;
sinApprox = zeros(1,iters); %// NEW
sinApprox(1) = sinVal; %// Value of the first iteration is sinVal
for a=2:iters
    newN = (-1).^(a-1).* abs(newN) .* ((sinVal .^ 2)/((2.*a - 1).*(2.*a-2)));

    %// NEW - Next iteration is the previous iteration added with newN
    sinApprox(a) = sinApprox(a-1) + newN;
end

要检查这是否有效,让我们看看在10次迭代后如何计算sin(2)

y2 = sin_N(2, 10)

这就是我得到的:

y2 =

 2.0000    0.6667    0.9333    0.9079    0.9093    0.9093    0.9093    0.9093    0.9093    0.9093

正如您所看到的,该值开始收敛于0.9093左右,这与sin(2)大致相等的内容一致:

ytrue = sin(2)

ytrue =

 0.9093