2015-05-25 6 views
1

У меня есть уравнение 1 = ((π r) n)/n! ∙ е (-π г)Решить уравнение с экспоненциальным членом

Я хочу, чтобы решить эту проблему с помощью MATLAB. Правильный ли код для этого? Ответ мне непонятен.

n= 500; 
A= 1000000; 
d= n/A; 
f= factorial(n); 
solve (' 1 = (d * pi * r^2)^n/f . exp(- d * pi * r^2) ' , 'r') 

Ответ, который я получаю:

Warning: The solutions are parametrized by the symbols: 
k = Z_ intersect Dom::Interval([-(PI/2 - 
Im(log(`fexp(-PI*d*r^2)`)/n)/2)/(PI*Re(1/n))], (PI/2 + 
Im(log(`fexp(-PI*d*r^2)`)/n)/2)/(PI*Re(1/n))) 

> In solve at 190 

ans = 

    (fexp(-PI*d*r^2)^(1/n))^(1/2)/(pi^(1/2)*d^(1/2)*exp((pi*k*(2*i))/n)^(1/2)) 
    -(fexp(-PI*d*r^2)^(1/n))^(1/2)/(pi^(1/2)*d^(1/2)*exp((pi*k*(2*i))/n)^(1/2)) 
+0

Я бы посоветовал вам перейти на документацию для MATLAB, из того, что я вижу, есть довольно много полезных документов. – Jaques

+0

Мне будет интересно получить ответ, но у меня нет установленного MATLAB. Было бы неплохо добавить это к вашему вопросу. –

+0

@ ThorbjørnLindeijer - Я запустил код на моем конце, и я обновил пост OP. Для меня это тоже не имеет большого значения. – rayryeng

ответ

1

Пару вещей отметить:

  1. MATLAB не использует значения из A, d и f со своего рабочего места.
  2. f . exp не делает совсем не то, что вы хотели, что было умножением. Вместо этого он становится неизвестной функцией fexp
  3. Передача дополнительных опций от 'Real', true до solve устраняет большинство этих посторонних условий.

Вы, вероятно, следует избегать вызова версии solve, которая принимает строку, и использовать Символическое Toolbox вместо (syms 'r')

2

У вас есть несколько проблем с вашим кодом.

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, фактически не выглядят реальными.

+0

Я не упоминал, что 'f' стал' Inf', потому что в любом случае он не используется решающим вызовом, проблема, которую я счел более актуальной. –