这是我的数学方法课程。我正在努力理解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
的每个列元素的阶乘值。
答案 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);end
对whatsoever
的每个元素执行语句。如果它是一个数字,那么在这个数字上,如果它是一个向量/数组,那么就在它的每一个元素上。
1:1:n
在现场创建一个从1
到n
的整数数组(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永远不会更改。
这应该足以帮助您入门。
干杯!