欧拉和斐波那契在脚本中的近似值

Euler's and Fibonacci's approximation in script

我在Matlab中写了两个函数;一个求解输入的阶乘,另一个求解斐波那契数列的第 n 项。我现在正在尝试为每个函数制作一个脚本 - 一个计算欧拉数到 10 位小数,另一个计算斐波那契倒数到 10 位小数。

Image here

我分别为阶乘和斐波那契数列创建了以下两个函数。

function [ nfactorial ] = get_fact( n )
%input a non-negative integer
%output is factorial of that integer
for i=0:n
    nfactorial=prod(1:n);
end

function [ F ] = get_fib( k )

if k < 0
    fprintf('positive integer please')
end

k = k + 1;
F(1) = 0;    % 0th Fibonacci term
F(2) = 1;    % 1st Fibonacci term
F(3) = 1;    % 2nd Fibonacci term
i = 4;

while k >= i
    F(i) = F(i-1) + F(i-2);
    i = i + 1;
end
   F = F(k)
end

我该如何将它们放入脚本中?

我试过了:

for i = 0:n
    e = prod(1 / get_fact( i ))
end

但这会返回错误并且显然没有设置容差,所以如果它确实有效,它将是无限的。我从未将函数放入脚本中,因此我们将不胜感激。

您的函数的语法和调用您的函数在每种情况下都很好。另一方面,您的函数有一些语义问题。

get_fact中:

function [ nfactorial ] = get_fact( n )
%input a non-negative integer
%output is factorial of that integer
for i=0:n
    nfactorial=prod(1:n);
end

prod(1:n) 将从 1n 的数字相乘,参见 help :help prod。所以它自己精确地计算出阶乘!无需在 i 上循环:您将一遍又一遍地计算相同的东西。更严重的是:get_fact(0) 会给你 0,这是不应该的。为这种情况准备你的函数!

get_fib中:

function [ F ] = get_fib( k )

if k < 0
    fprintf('positive integer please')
end

k = k + 1;
F(1) = 0;    % 0th Fibonacci term
F(2) = 1;    % 1st Fibonacci term
F(3) = 1;    % 2nd Fibonacci term
i = 4;

while k >= i
    F(i) = F(i-1) + F(i-2);
    i = i + 1;
end
   F = F(k)
end

如果 k<0,你会打印一条消息,但之后你不会做任何额外的事情。这应该是某种错误消息,因此您应该使用 error 而不是 fprintf,或者在 fprintf 之后写 F=NaN; return 以过早地从函数中 return (没有官方错误)。否则这个功能对我来说似乎没问题。

现在,如果您将 get_fact 保存到 get_fact.m 并将 get_fib 保存到 get_fib.m MATLAB 路径(始终包括当前目录)的某处,您可以调用它们是 get_fact(3) 并且与您尝试的 get_fib() 类似。

但是你的调用也有问题:

for i = 0:n
    e = prod(1 / get_fact( i ))
end

在这里你会再次调用 e = prod(1 / get_fact( i )) 为每个 i 在每个步骤中覆盖 e。你显然不想要这个。您应该定义一个向量来代替 e 并在最后对其内容求和,或者在每次迭代中不断增加标量 e 的值(但随后您必须将其初始化为 0)。 prod(1/get_fact(i)) 只会给你 1/get_fact(i) 因为这个数量是一个标量。您将需要以任何方式求和,并且必须以不同的方式求和(请参阅前面的几句话)。

你老师说的公差与循环的截止有关,你在e的值递增,即对无穷和的近似。首先,您可以只采用给定的近似最大阶数,如果它按预期工作,那么您可以着手实现公差。