使函数对矢量输入敏感

时间:2014-02-19 19:35:54

标签: matlab

这是我的数学方法课程。我正在努力理解MATLAB及其语法,但我100%自学成才,所以如果我的尝试看起来很荒谬,请耐心等待。

我写了这个非常简单的函数来近似数字e

function e= calcEulerLimit(n)
e = (1 + 1./n).^n;
end

这是使用极限n到无穷大方法的数字e的“基本”定义。对于MATLAB,我定义了以下向量(当我在后者中讨论n时,我总是指这个向量n

n=[1:1:10]=[ 1 2 3 4 5 6 7 8 9 10 ]

并且输出正常我预期,当我在MATLAB中调用我的函数时,它对向量n输入很敏感。

>> calcEulerlimit(n)

ans =

    2.0000    2.2500    2.3704    2.4414    2.4883    2.5216    2.5465    2.5658    2.5812    2.5937

现在我想用泰勒方法完成与上面完全相同的方法,使用无限求和公式来描述e,这里是我被困的地方,以下简单的代码可以工作:

function e = calcEulerSum(n)
e=1;                % base-case, start variable
for i=1:1:n       % for loop with step size one
    e=e+1/factorial(i)
end
end 

但是当我想输入一个计算所有变量的n向量时,这个输入当然不起作用。

我尝试了另一个for循环和while循环,但while循环似乎永远不会终止:

function e = calcEulerSum3(n)
while n
e=1;
e = e + 1./cumprod(n);
end
end

使用cumprod(n)获取向量n的每个列元素的阶乘值。

3 个答案:

答案 0 :(得分:3)

您正在尝试向量化您的功能。你的标量解决方案是有效的,让我们看看它在i递增时的作用:

       e0 = 1;
i = 1: e(1) = e0 + 1/factorial(1)
i = 2: e(2) = e(1) + 1/factorial(2) = e0 + 1/factorial(1) + 1/factorial(2)
                                    = e0 + sum(1./factorial(1:2))
i = 3: e(3) = e(2) + 1/factorial(3) = ...
                                    = e0 + sum(1./factorial(1:3))
    ...
i = n: e(n) = e(n-1) + 1/factorial(n) = e0 + 1/factorial(1) + ... + 1/factorial(n)
                                      = e0 + sum(1./factorial(1:n))

那么你能想出一个通用表达式来计算给定e的向量n吗? cumsum功能将派上用场。

答案 1 :(得分:1)

for i=whatsoever,statement(i);endwhatsoever的每个元素执行语句。如果它是一个数字,那么在这个数字上,如果它是一个向量/数组,那么就在它的每一个元素上。

1:1:n在现场创建一个从1n的整数数组(1:n也可以)。如果n已经是包含您要迭代的元素的向量,则可以直接使用它:for i=n

但是,为什么在第一个和第三个代码块中使用虚线版本的操作,而不是第二个?因为你读过MATLAB的矢量化?然后你似乎走在正确的轨道上,但请记住,点矢量化是完全摆脱显式循环。

答案 2 :(得分:-1)

function e = calcEulerSum(n)
e=nan(1,length(n));                % initialize to nan
for j=1:length(n)                % for each element in the input
    e(j)=sum(1./factorial(0:n(j))); %each entry is computed in this step, one at a time
end 

在这段代码中,每个近似都已经过矢量化,但我没有看到一种简单的方法来矢量化整个程序。也没有错误检查,比如确保n的元素是非负整数,或者n是向量而不是数组。

在原始示例中,while永远不会终止,因为n永远不会更改。

这应该足以帮助您入门。

干杯!