Решатель OpenModelica достигает максимального числа итераций, но не может найти root
Я пытаюсь смоделировать 1D систему из 3 скользящих тел, как я объяснил здесь:
и вот код, который я реализовал:
model friction
//constants
parameter Real muk = 0.2;
parameter Real mus = 0.3;
parameter Real m1 = 1.0;
parameter Real m2 = 2.0;
parameter Real m3 = 3.0;
parameter Real Fn12 = 3.0;
parameter Real Fn23 = 2.0;
parameter Real absTol = 0.1;
//variables
Real X1, X2, X3, V1, V2, V3, A1, A2, A3, F1, F2, F3, Ff12, Ff23, Fs12, Fs23;
initial equation
X1 = 0;
X2 = 0;
X3 = 0;
V1 = 0;
V2 = 0;
V3 = 0;
equation
F1 = 2 * sin(5 * time);
F2 = 2 * sin(7 * time);
F3 = 3 * sin(11 * time);
V1 = der(X1);
V2 = der(X2);
V3 = der(X3);
A1 = der(V1);
A2 = der(V2);
A3 = der(V3);
m1 * A1 = F1 - Ff12;
m2 * A2 = F2 + Ff12 - Ff23;
m3 * A3 = F3 + Ff23;
Fs12 = (m2 * F1 - m1 * (F2-Ff23)) / (m1 + m2);
Fs23 = (m3 * (F2 + Ff12) - m2 * F3) / (m2 + m3);
if abs(V1 - V2) < absTol and abs(Fs12) < mus * Fn12 then
Ff12 = Fs12;
else
Ff12 = muk * Fn12 * sign(V1 - V2);
end if;
if abs(V3 - V2) < absTol and abs(Fs23) < mus * Fn23 then
Ff23 = Fs23;
else
Ff23 = muk * Fn23 * sign(V2 - V3);
end if;
end friction;
Wolfram SystemModeler может запустить симуляцию до t=6 секунд, но результаты не такие, как я ожидал, как я объяснил здесь. И когда я использую OpenModelica для решения симуляции, я получаю ошибку ниже:
C: /Users/foo/AppData/Local/Temp/OpenModelica/OMEdit/friction.exe -port=64457 -logFormat = xmltcp -override = startTime =0, stopTime = 10, stepSize =0,02, допуск =1e-6, решатель =dassl,outputFormat=mat,variableFilter=.* -r=friction_res.mat -jacobian= ColoredNumeric -w -lv=LOG_STATS Предупреждение: максимальное число итераций достигнуто, но корень не найден Предупреждение: максимальное количество итераций достигнуто, но корень не найден Ошибка Решение нелинейной системы 42 в момент времени 0,2 Ошибка решения нелинейной системы 42 в момент времени 0,2 Нелинейная система 42 дает сбой: при t=0,2 Решение нелинейной системы 42 не удалось в момент времени =0,2. Для получения дополнительной информации, пожалуйста, используйте -lv LOG_NLS. Процесс моделирования не удался. Выход с кодом -1.
Буду признателен, если вы поможете мне узнать, в чем проблема и как я могу ее решить?
2 ответа
Для моделирования сухого трения я могу порекомендовать https://github.com/dzimmer/ZimmersModelicaTutorial/blob/master/Tutorial2015/BaseComponents/Friction/IdealDryFriction.mo который использует Modelica.Mechanics.Translational.Interfaces.PartialFriction простым и чистым способом.
Вы пытаетесь написать свою собственную модель трения.
В Modelica нормальным способом является использование s-параметризации, например, путем наследования от: Modelica.Mechanics.Translational.Interfaces.PartialFriction (или с использованием существующей модели).
Его документация находится по адресу: http://doc.modelica.org/help/Modelica_Mechanics_Rotational_UsersGuide.html
В частности, у вас есть Fs12 и Fs23, которые являются максимальной силой трения для сцепления, которая работает, если они постоянны - но здесь они зависят от Ff12 и Ff23 - и они, в свою очередь, зависят от Fs12 и Fs23; который не работает.