2010-02-11 44 views
0

我有一個不連續的功能等descontinuous初始數據

f(x)=0.5(exp(-80x^2)+1) if -0.3<x<-0.1 

f(x)=0.5exp(-80x^2) otherwise, 

與域0≤X≤1.

如何將其定義爲在MatLab的內聯函數?

+6

嗯..你有好的數學函數。等等,問題在哪裏? – mauris 2010-02-11 09:47:02

+0

看起來對我來說是連續的... – 2010-02-11 09:54:35

+0

我渴望知道如果你沒有-0.3會發生什麼:) – 2010-02-11 09:54:39

回答

2

在八度(可能MATLAB太),邏輯表達式的計算結果爲0和1。因此,

y = inline('0.5*(exp(-80*x^2) + (-0.3 < x && x < -0.1))', 'x') 
3

由於OP構成的域爲0 < = X < = 1,則簡單的答案是使用正分支!當x是負值時,不需要擔心值。

接下來,我建議您不要使用內聯函數。內聯函數很慢。只有當你的matlab版本太舊以至於你不能定義一個函數句柄時才使用它們。那麼

f = @(x) 0.5*exp(-80*x.^2); 

如果你必須定義一個內聯函數,那麼我真的建議你得到一個更新版本的matlab。如果你仍然拒絕進入本世紀,那麼這樣做:

f = inline('0.5*exp(-80*x.^2)','x'); 

還有一種可能性,那就是你也搞砸了函數的定義域。如果函數的域不是嚴格爲0 < = x < = 1,那麼可能會出現負值,那麼我們可能需要擔心函數的不連續性質。在這裏你可以使用類似piecewise_eval的東西,正如MATLAB Central File Exchange上發佈的那樣。此工具允許您構建和評估分段函數,並且可以根據需要將其構建到內聯函數或匿名函數/函數句柄中。因此,這個表達式將建立一個功能手柄,你的目的:其他

f = @(x) piecewise_eval(x,[-.3, -.1], ... 
      {@(x) 0.5*exp(-80*x.^2), ... 
      @(x) 0.5*(exp(-80*x.^2) + 1), ... 
      @(x) 0.5*exp(-80*x.^2)}); 

有一點需要提防的是會發生什麼在破發點自己。 piecewise_eval函數假定一個點位於半開區間內,如:

-0.3 <= x < -0.1 

用於函數的中間分支。這在大多數這種分段函數的定義中是相當標準的。