У вас есть несколько проблем с вашим кодом.
1. Во-первых, вы оцениваете некоторые детали с плавающей точкой. Это не всегда плохо, если вы знаете, что решение будет точным. Однако factorial(500)
переполняется до Inf
. Фактически, для factorial
, что-либо большее, чем 170
, будет переполняться, и любой вход, превышающий 21
, потенциально неточный, потому что результат будет больше flintmax
. Этот расчет должен быть предварительно символически с помощью sym/factorial
:
n = sym(500);
f = factorial(n);
, который возвращает целое число, приблизительно равное 1.22e1134
для f
.
2. Вы используете период ('.'
), чтобы указать умножение. В MuPAD, на котором основаны большинство символических математических функций, период равен shorthand for concatenation.
Кроме того, как указано в документации R2015a (и, возможно, раньше):
Струнные входы будут удалены в будущих версиях. Используйте syms
, чтобы вместо этого объявить переменные и передать их как список или вектор, разделенный запятыми.
Если вы не использовали строку, я не думаю, что ваша команда могла бы неправильно интерпретироваться и вернуть такой запутанный результат.Вот как вы можете использовать solve
с символическими переменными:
syms r;
n = sym(500);
A = sym(1000000);
d = n/A;
s = solve(1==(d*sym(pi)*r^2)^n/factorial(n)*exp(-d*sym(pi)*r^2),r)
, который через несколько минут, возвращает 1000 на 1 вектор решений, все из которых являются сложными. Как предлагает @BenVoigt, вы можете попробовать опцию 'Real'
для solve
. Однако, по крайней мере, в R2015a четыре решения, возвращаемые в терминах lambertw
, фактически не выглядят реальными.
Я бы посоветовал вам перейти на документацию для MATLAB, из того, что я вижу, есть довольно много полезных документов. – Jaques
Мне будет интересно получить ответ, но у меня нет установленного MATLAB. Было бы неплохо добавить это к вашему вопросу. –
@ ThorbjørnLindeijer - Я запустил код на моем конце, и я обновил пост OP. Для меня это тоже не имеет большого значения. – rayryeng