Как инвертировать встроенную функцию в Matlab? - PullRequest
0 голосов
/ 26 ноября 2018

Если у меня есть анонимная функция, например:

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

Так что я легко могу найти a для x = 4, но как я могу найти x, который даст мне y = 0.4?Я на самом деле ищу простой способ иметь х (у) вместо у (х).

Ответы [ 2 ]

0 голосов
/ 26 ноября 2018

Один из подходов состоит в том, чтобы использовать функцию интерполяции (1D) MATLAB 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)

Это соответствует результатам подхода Криса Луенго .

>> 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
0 голосов
/ 26 ноября 2018

Один из тривиальных подходов - использовать числовой алгоритм для нахождения нуля y(x) - 0.4:

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

Теперь x равно 4.6667, а y(x) возвращает 0.4.

Обратите внимание, что это простой подход, но он не дешев в вычислительном отношении.Кроме того, вам нужна подходящая начальная точка, которую я здесь установил 0.Если ваша функция имеет несколько точек, где она достигает 0.4, то вы получите ближайшую к этой начальной точке точку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...