我有一个分段函数F_m(x)
如下所示,其中x_m
和\alpha
是常量,m
是下标。
我需要解决涉及F_m(x)
的以下等式,其中N
和C
是常量,tau
是我想要解决的变量。
所以我把这个问题提到了Matlab。首先,我在.m文件中编写一个函数:
function y=pareto_CDF(x, xm)
alpha = 2; %set alpha to 2
if x < xm
y = 0;
else
y = 1-(xm/x)^alpha;
end
然后在另一个.m文件中写道:
syms x;
C = 1000;
N = 20000;
%Pareto Distribution CDF: F(x)=1-(xm/x)^alpha.
%alpha is set to 2 in this program
alpha = 2;
j=1:1:N;
f=sum(pareto_CDF(x, 1/(alpha*rand())));
a = f - C;
tau = solve(a,'x');
但是,运行它时我从Matlab收到以下错误:
Conversion to logical from sym is not possible.
Error in pareto_CDF (line 4)
if x < xm
现在的问题是:我需要将x
声明为sym
,因为它是等式中的变量,因为我在此函数中调用了pareto_CDF(x, xm)
,x
也是sym
,但Matlabt不支持sym
和值(xm)之间的比较。这个错误实际上源于函数F(x)
的分段性质。
那么,我该如何解决这个问题呢?
答案 0 :(得分:2)
使用heaviside()
功能解决了我的问题。重写函数.m文件如下:
function y=pareto_CDF(x, xm)
alpha = 2; %set alpha to 2
y = heaviside(x-xm).*(1-(xm/x).^alpha);
我使用逐个元素的产品/除法(。*,。/)的原因是因为输入可能是一个向量。
答案 1 :(得分:0)
如何更改pareto_CDF,使其将向量作为输入并将向量作为输出返回:
xm = 4;
% test with scalar x
pareto_CDF( 1, xm ) % => 0
pareto_CDF( 6, xm ) % => 0.556
% test with vector x
pareto_CDF( [1,6] , xm ) => [0, 0.556]
end
function y = pareto_CDF(x, xm)
alpha = 2; %set alpha to 2
y = 1-(xm./x).^alpha;
y( x < xm ) = 0;
end