Так что это вопрос, который я изменил:приблизительной Эйлеры в сценарии
ответ
Во-первых, я хотел бы переписать функцию для нахождения факториала к более простой
function n = factorial(n)
n = prod(1:n);
end
петле в вашем вопросе не нужно, как вы никогда не используйте переменную цикла i
. Я бы не использовал эту функцию, хотя для моего решения, поскольку она может быть довольно медленной, потому что вам приходится вычислять избыточную информацию на каждой итерации цикла.
Если вы все еще хотите использовать for
петлю вам нужно переписать его
function f = factorial(n)
f = 1; % 0 factorial
for i = 1:n
f = f * i;
end
end
Вы можете использовать натуральный логарифм и правила log
с, чтобы определить очень точное значение e
с с которыми вы можете сравнить. Значение e
вы можете проверить по x^(1/log(x))
, где x
может быть любым положительным реальным номером, кроме 1
, например 2
. Мы можем увидеть это в
Теперь, как мы проверяем, что мы вычислили значение e
до 10 десятичных знаков точности. Ну, учитывая, что b
сверху очень точное представление e
мы можем сравнить против него, чтобы определить, когда мы достигли точного решения
x = 2; % Any positive number other than 1
c = x^(1/log(x));
...
if (abs(e - c) < 1e-10)
break;
end
В моем решении e
это приближенное значение Я вычислен с бесконечным сумма. Примечание: абсолютное значение принимается для предотвращения ложных срабатываний, когда e - c
является отрицательным числом.
Теперь эффективный метод вычисления бесконечной суммы.Мы можем использовать способ вычисления факториала, чтобы не вычислять его во время каждой итерации, значительно повышая эффективность. Во-первых, нам нужна переменная суммы, e
в моем случае, чтобы отслеживать наше приблизительное решение. Тогда нам нужна другая переменная, чтобы отслеживать факториал, f
в моем случае. Как 0
смешной случай, мы начнем с ним
e = 0;
f = 1; % 0 factorial
e = e + 1/f;
и теперь у нас есть первый элемент в нашей бесконечной суммы. Затем мы можем использовать бесконечную сумму для вычисления более точного приближения к e
. Факториал может обновляться при каждой итерации с f = f * n;
приводит к
for n = 1:inf
f = f * n; % Compute new factorial
e = e + 1/f; % Infinite sum
...
end
Теперь положить, что в целом производит
x = 2; % Any positive number other than 1
c = x^(1/log(x));
e = 0;
f = 1; % 0 factorial
e = e + 1/f;
for n = 1:inf
f = f * n; % Compute new factorial
e = e + 1/f; % Infinite sum
if (abs(e - c) < 1e-10)
break;
end
end
Я должен использовать цикл for для вычисления факториала, поэтому я так и сделал. Однако я получаю предупреждение для скрипта: Предупреждение: индекс цикла FOR слишком велик. Усечение до 9223372036854775807. > При тестировании (строка 9) Как исправить это? –
И я также хочу вызвать функцию get_fact в скрипте –
Используя '9223372036854775807' вместо' inf'. MATLAB не может зацикливаться до бесконечности, он может зацикливаться только до «9223372036854775807». Тем не менее, это просто предупреждение, чтобы вы могли спокойно его игнорировать. Тогда ваша функция 'get_fact' ошибочна. Цикл 'for' бесполезен. Вы никогда не используете 'i', и вы перезаписываете' nfactorial' во время каждой итерации. Мое решение также по-прежнему вычисляет факториал с помощью цикла 'for', он просто делает это более точно. – IKavanagh
Используйте 'while' петли вместо этого что-то вроде', а прод ((1/get_fact (я))> 1E-10' – Adriaan
'1/get_fact (i)' является скалярным значением, а не вектором, поэтому 'prod (1/get_fact (i))' также будет точно таким же значением, как '1/get_fact (1) i) 'и не будет сходиться к' e'. Также 'prod ((1/get_fact (i)))> 1E-10' неверно и не скажет вам, что вы вычислили' e' до десяти десятичных знаков точности, он только скажет вам, что значение 'prod ((1/get_fact (i)))> 1E-10' больше, чем '1e-10'. – IKavanagh
'while prod ((1/get_fact (i)))> 1E-10' скажет мне, если он больше, чем' 1e-10', как сказал другой комментатор. –