如何在Matlab中逆内联函数?

时间:2018-11-26 16:42:36

标签: matlab

例如,如果我具有匿名功能,

a=3;
b=4;
y = @(x) (x)./(a+b+x);

因此,我可以轻松地找到x = 4的a,但是如何找到一个将给我y = 0.4的x?我实际上正在寻找一种简单的方法来使x(y)而不是y(x)。

2 个答案:

答案 0 :(得分:3)

一种简单的方法是使用数值算法来找到y(x) - 0.4的零:

target = 0.4;
x = fzero(@(x) y(x)-target, 0)

现在,x4.6667,而y(x)返回0.4

请注意,这是一种简单的方法,但计算成本并不便宜。另外,您需要一个合适的起点,在这里我将其设置为0。如果您的函数在到达0.4的地方有多个点,那么您将获得一个最接近此起点的点。

答案 1 :(得分:1)

一种方法是使用MATLAB的插值(1D)函数interp1,但这对您的函数适用于参数值,以确保y(x)非递减函数

step = .01;                  % Control precision (smaller = more precise)
Xmax = 50;                   % Largest x of interest
X = [0:step:Xmax]'; 
Y = y(X);                    % Generate discrete approximation of function
yinvh=@(L) interp1(Y,X,L);

Targets = [0.25 0.4 0.75]';
yinvh(Targets)

这与Cris Luengo's approach的结果相匹配。

>> yinvh(Targets)'
ans =
    2.3333    4.6667   21.0000

Illustration of inverse function

figure, hold on, box on
plot(X,y(X))
plot(zeros(3,1),Targets,'rx')
plot(yinvh(Targets),zeros(3,1),'rx')
for k = 1:length(Targets)
    plot([0; yinvh(Targets(k))],Targets(k)*ones(2,1),'k--')
    plot(yinvh(Targets(k))*ones(2,1),[0 Targets(k)],'k--')
end