Matlab中分段函数的总和

时间:2014-11-27 12:19:01

标签: matlab symbolic-math

我有一个分段函数F_m(x)如下所示,其中x_m\alpha是常量,m是下标。

piecewise function

我需要解决涉及F_m(x)的以下等式,其中NC是常量,tau是我想要解决的变量。

equation

所以我把这个问题提到了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)的分段性质。

那么,我该如何解决这个问题呢?

2 个答案:

答案 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