0

matlab中有没有办法限制函数中的变量

例如我有一个功能

function S0 = S0Func(obj, c, delta, xT, sigma)
beta = obj.betaFunc(sigma);
xb = obj.xbFunc(c, delta, sigma);
S0 = (1-obj.tau).*(obj.x0./(obj.r-obj.mu)-c./obj.r-(xb./(obj.r-obj.mu)-c./obj.r).*((obj.x0./xb).^beta)-((delta-1).*c./obj.r).*((obj.x0./xT).^beta-((obj.x0./xb).^beta)));
end

我想要限制的地方(obj是一个类的对象)

0<xb<xT<1
0<c
1<delta

我想做的是在上面提到的限制下绘制以下的 3d 图

S0Func(2.7, 1, 1, 0.3)-S0Func(c,delta,xT,0.2)<0;

编辑 我尝试过使用等值面

optimalStraightCoupon = fminbnd(@(c) -(S0Function(c,1,1)+D0Function(c,1,1)), 0, 4);
[xT, delta, c] = meshgrid(0.8:.01:1, 1:.1:3, 0:.1:4);
values = S0Function(optimalStraightCoupon,1, 1)- S0Function(c,delta, xT);            
patch(isosurface(xT, c, delta, values, 1), 'FaceColor', 'red');
view(3);

我得到了一些输出,但它不正确,因为违反了对 xT 的限制。

任何帮助表示赞赏。谢谢你。

4

3 回答 3

0

有点不清楚您要达到的目标。我希望您知道您可以编写诸如(伪代码)之类的语句:

if c>=0 exit

从某种意义上说,这将您的函数限制为仅对满足定义约束的值进行操作。

前面说的太简单了,我敢肯定我误解了你的问题。

于 2012-04-20T08:25:58.343 回答
0

当您的约束被违反时,我只会返回 NaN 。

只需将以下行添加到您的函数中(最好在计算之前以节省时间)

if delta <= 1 || c <= 0 || ... % I assume you can write them yourself
   S0 = NaN;
   return
end

绘图不会绘制 NaN。

尽管在您输入c,delta,xT时,问题是为什么它们首先被设置为无效值。如果您事先保证,您可以节省一些支票并因此节省时间。

于 2012-04-20T10:46:29.317 回答
0

不,看来您希望的不仅仅是 3-d 图形。您似乎希望将此函数视为三个变量的函数:c、delta、xT。所以是一个 4-d 图。在这种情况下,您将需要简单地评估 3-d 网格上的函数(使用 meshgrid 或 ndgrid 生成点。)

然后使用等值面将结果可视化,本质上是一个更高维的等高线图。在不同的等值水平上做几个这样的图。

于 2012-04-20T10:33:29.593 回答