Проблема: аннотация inverse
функции игнорируется, а обратное вычисляется численно.
Согласно Спецификации Modelica можно указать обратное для данной функции.
Чтобы проверить эту функцию, я попытался использовать очень тривиальную модель с двумя функциями:
- direct функция y (x) = грех (x)
function y_from_x
input Real x;
output Real y;
algorithm
y:=sin(x);
annotation(inverse(x = x_from_y(y)));
end y_from_x;
- его обратная функция x (y) = asin (y)
function x_from_y
input Real y;
output Real x;
algorithm
x:=asin(y);
end x_from_y;
- пара соответствующих уравнений
y = time;
y = y_from_x(x);
Как видите, для получения значения переменной x , функция y_from_x должно быть инвертировано ;следовательно, поскольку аннотация inverse
явно говорит о том, как инвертировать функцию, я ожидаю, что будет вызван x_from_y .
Нет, этого не происходит.Даже на этапе выравнивания обратная функция отбрасывается, и решение y_from_x вычисляется численно с помощью итерационного цикла.Это происходит как с OpenModelica v1.14, так и с Dymola 2018.
Это ожидаемое поведение?Как использовать эту inverse
аннотацию?Есть ли способ избежать такого неэффективного итеративного решения?
Полный код
model test_inverse
Real y, x;
function y_from_x
input Real x;
output Real y;
algorithm
y:=sin(x);
annotation(inverse(x = x_from_y(y)));
end y_from_x;
function x_from_y
input Real y;
output Real x;
algorithm
x:=asin(y);
end x_from_y;
equation
y = time;
y = y_from_x(x);
end test_inverse;