例如,如果我具有匿名功能,
a=3;
b=4;
y = @(x) (x)./(a+b+x);
因此,我可以轻松地找到x = 4的a,但是如何找到一个将给我y = 0.4的x?我实际上正在寻找一种简单的方法来使x(y)而不是y(x)。
答案 0 :(得分:3)
一种简单的方法是使用数值算法来找到y(x) - 0.4
的零:
target = 0.4;
x = fzero(@(x) y(x)-target, 0)
现在,x
是4.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
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