我有等式1 =((πr 2 ) n )/ n! ∙e ( - πr 2 )
我想用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 :(得分: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 x 1的解决方案矢量,所有解决方案都很复杂。正如@BenVoigt建议的那样,您可以尝试solve
的'Real'
选项。但是,至少在R2015a中,以lambertw
表示返回的四个解决方案实际上并不真实。
答案 1 :(得分:1)
有几点需要注意:
A
,d
和f
的值。f . exp
根本没有做你想要的,这是乘法。它变成了一个未知函数fexp
'Real', true
的其他选项传递给solve
可以消除大部分无关条件。您可能应该避免调用接受字符串的solve
版本,而是使用符号工具箱(syms 'r'
)