在 matlab 中声明函数时使用“int”

问题描述 投票:0回答:2

我正在尝试定义一个看起来有点像这样的函数:

function u = expectedutility(x)
u = int(utility(x,I)*density(I),I,-10,10)

function t = utility(x,I)
m = x+I
if m>=0 u = m^(1/2)
else u = -2*((-m)^(1/2))

end
end
function s = density(I)
s = 1/20
end

end

在上面的示例中,我使用了上限为 10 、下限为 -10 的均匀分布,但我希望能够对其进行概括,以便函数密度(I)可以是随机变量 I 的任何 pdf。我知道我可以使用piecewise(.) 来指定实用程序,但我使用的是2016a,所以它不在我的Matlab 版本上。

基本上我的问题是,每当我点击

"expectedutility(2)"
时,我都会收到错误

"Undefined function 'int' for input arguments of type 'double'."

我希望“int”能够对 I 进行积分,插入 -10 和 10 说,然后允许我观察 u 的不同 x 值。

function matlab numerical-integration
2个回答
1
投票

您的代码中有几处错误,但我认为您正在尝试做的是集成一个具有符号变量

I
和数字变量
x
的函数。

代码中的主要问题是您根本没有定义

I
。但是,即使您这样做,也会遇到第二个问题:符号函数中不允许使用条件。还有一种替代方法,即使用
heaviside
函数。

如果您将

utility
函数定义为:

function u=utility(x,I)
m = x+I;
u = m^(1/2)*heaviside(m); % for positives
u =u + -2*( (-m)^(1/2) )*heaviside(-m);    % for negatives  
end

然后您可以拨打:

density=1/20;
syms I;
x=2;
u = int(utility(x,I)*density,I,-10,10)

它给出:

u=
  (4*3^(1/2))/5 - (16*2^(1/2))/15

要获得数值结果,您只需调用

double(u)

ans =

  -0.1229

如果您不想要单独的功能,只需这样做:

density=1/20;
syms I;
x=2;

m = x+I;
u = m^(1/2)*heaviside(m); % for positives
u =u + -2*( (-m)^(1/2) )*heaviside(-m);    % for negatives 

uint = int(u*density,I,-10,10)

0
投票

整数的

int
函数不接受任何双精度数据类型作为输入。您必须使用
syms x
(符号标量变量)才能使其兼容。您可以检查这里。代码的另一个问题是变量
I
未定义。

© www.soinside.com 2019 - 2024. All rights reserved.