我有矢量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
答案 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