我以前从未使用过Matlab,而且我真的不知道如何修复代码。我需要用k从1到1000绘制log(1000 over k)。

y = @(x) log(nchoosek(1000,x));

fplot(y,[1 1000]);


错误:

Warning: Function behaves unexpectedly on array inputs. To improve performance, properly
vectorize your function to return an output with the same size and shape as the input
arguments.
In matlab.graphics.function.FunctionLine>getFunction
In matlab.graphics.function.FunctionLine/updateFunction
In matlab.graphics.function.FunctionLine/set.Function_I
In matlab.graphics.function.FunctionLine/set.Function
In matlab.graphics.function.FunctionLine
In fplot>singleFplot (line 241)
In fplot>@(f)singleFplot(cax,{f},limits,extraOpts,args) (line 196)
In fplot>vectorizeFplot (line 196)
In fplot (line 166)
In P1 (line 5)

最佳答案

代码有几个问题:


nchoosek不会在第二个输入上向量化,也就是说,它不接受数组作为输入。 fplot对于矢量化功能工作更快。否则可以使用,但是会发出警告。
对于第一个输入的如此大的值,nchoosek的结果几乎溢出。例如,nchoosek(1000,500)给出2.702882409454366e+299,并发出警告。
nchoosek需要整数输入。 fplot通常使用指定范围内的非整数值,因此nchoosek会发出错误。


您可以利用阶乘和gamma function之间的关系以及Matlab具有gammaln的事实来解决这三个问题,该事实直接计算gamma函数的对数:

n = 1000;
y = @(x) gammaln(n+1)-gammaln(x+1)-gammaln(n-x+1);
fplot(y,[1 1000]);


请注意,对于指定范围内的所有x,您都获得了带有y值的图,但实际上二项式系数仅针对非负整数定义。

matlab - 绘图日志(n超过k)-LMLPHP

关于matlab - 绘图日志(n超过k),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56277988/

10-10 17:04