Russian Qt Forum
Март 28, 2024, 16:43 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 [2] 3   Вниз
  Печать  
Автор Тема: Пружина  (Прочитано 20794 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #15 : Октябрь 13, 2015, 08:36 »

откуда во второй итерации +3 если должно быть -3? a * t = -3, фиксированная величина, скорость будет стремиться к -бесконечности.
Да, уточним
Цитировать
v += -b * dt * v
Изначально v = 1, dt = 1, b = 3 (b - жесткость затухание)
Первый шаг v = 1 - 3 = -2. Второй шаг v = -2 - 3 * (-2) = 4. Получили вообще положительную обратную связь. Конечно попробовал ограничить b = min(b, 1 / dt) - да, так вразнос не идет, но пере-колебания затухают очень медленно (если вообще затухают)

У меня просто слов нет..(

Ничего здесь посоветовать не могу..
А я нисколько не удивлен - это обычный рез-т научного работника  Улыбающийся
« Последнее редактирование: Октябрь 13, 2015, 16:16 от Igors » Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2094



Просмотр профиля
« Ответ #16 : Октябрь 13, 2015, 11:21 »

Цитировать
А я нисколько не удивлен - это обычный рез-т научного работника
Конечно, о чём тут говорить, когда видишь такое:
Цитировать
Первый шаг v = 1 - 3 = -2. Второй шаг v = -2 - 3 * (-2) = 4. Получили вообще положительную обратную связь.
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #17 : Октябрь 13, 2015, 13:01 »

момент, а разве в уравнении v += -b * dt * v должна быть скорость в правой части? не УСКОРЕНИЕ?

т.е. v += -b * dt * a
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #18 : Октябрь 13, 2015, 16:27 »

момент, а разве в уравнении v += -b * dt * v должна быть скорость в правой части? не УСКОРЕНИЕ?

т.е. v += -b * dt * a
v += a * dt;  // к текущей скорости добавляем текущее ускорение
где
a = -b * v;   // вектор ускорения противоположен текущей скорости (трение, тормоз)

Конечно, о чём тут говорить, когда видишь такое:
Та я уже понял что кроме "фыркания" ничего не будет Улыбающийся Теплилась слабая надежда, но увы, все как всегда  Плачущий
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #19 : Октябрь 13, 2015, 17:04 »

Но если b > v про dt = 1, то объект будет только ускоряться, болтаясь в разные стороны Улыбающийся
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4724



Просмотр профиля WWW
« Ответ #20 : Октябрь 13, 2015, 17:23 »

если я правильно понял, отрицательная скорость — это скорость в противоположном направлении.

преобразуем v += -b * dt * v: v1 = v0(1 - b*dt).

для остановки (скорость стремится к 0) необходимо, чтоб |1 - b*dt| < 1, т.е. 0 < b*dt < 2.
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2094



Просмотр профиля
« Ответ #21 : Октябрь 13, 2015, 18:13 »

Цитировать
Та я уже понял что кроме "фыркания" ничего не будет  Улыбающийся Теплилась слабая надежда, но увы, все как всегда   Плачущий

У меня эта надежда уже довно в багажнике холодная лежит)

Цитировать
для остановки (скорость стремится к 0) необходимо, чтоб |1 - b*dt| < 1, т.е. 0 < b*dt < 2.
Даже больше скажу, для метода Эйлера, для данного уравнения, чтоб претендовать на какую-то точность должно выполняться условие b*dt << 1.

RK4 более устойчивый алгоритм:
Код
C++ (Qt)
#include <iostream>
#include <fstream>
#include <specmath/ode.h>
 
struct dynamical_system
{
   dynamical_system(const double & b = 1.0) : _b(b) {}
 
   void operator()(const double & v, const double & /*t*/, double & res) const
   {
       res = -_b*v;
   }
 
private:
   double _b;
};
 
 
int main()
{
   std::ofstream out("data.txt");
 
   double v = 1.0; // init velocity
   const double t0 = 0.0;
   const double t = 1.0;
   const double dt = 0.1; // ode step
   const double b = 3;
 
   auto observer = [&](const double & v, const double & t) { out << t << " " << v << std::endl; };
 
   specmath::rk4_ode_solver<double>::integrate(dynamical_system(b), v, t0, t, dt, observer);
 
   std::cout << v << std::endl;
 
   return 0;
}
 

« Последнее редактирование: Октябрь 13, 2015, 18:19 от m_ax » Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #22 : Октябрь 13, 2015, 20:08 »

Вот мувик, затухание уже 100(!) (правда обратная связь пресекается). Ни фига, все болтается на пол-шестого  Плачущий
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2094



Просмотр профиля
« Ответ #23 : Октябрь 13, 2015, 20:33 »

Вот мувик, затухание уже 100(!) (правда обратная связь пресекается). Ни фига, все болтается на пол-шестого  Плачущий
Ну мне лично этот мувик ни о чём не говорит, поскольку не знаю что там под капотом..

И ещё раз повторю:
Даже больше скажу, для метода Эйлера, для данного уравнения, чтоб претендовать на какую-то точность должно выполняться условие b*dt << 1.
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
popper
Гость
« Ответ #24 : Октябрь 14, 2015, 00:00 »

Думаю, что задачу можно описать без применения дифф. уравнений на основании закона сохранения энергии.
Путь начальная потенциальная энергия натянутой пружины Ео, тогда в некоторый момент времени t после начала движения должно выполняться:
Е(t)+Евращ_движ(t) + путь(t)*Апотерь = Ео,
где Е(t) - потенциальная энергия в текущей точке;
     Евращ_движ(t)  - энергия вращательного движения, определяемая через текущую угловую скорость движения центра масс;
     Апотерь - работа сил трения, в первом приближении постоянная величина, хотя, наверное, можно задать ее функцией скорости вращения, при этом немного усложнив уравнение.

Далее условие остановки в противоположной точке: Евращ_движ(t = tост) = 0.
Новое значение потенциальной энергии Ео' = Ео - полный_путь*Апотерь.
Затем вычисления повторяются в противоположную сторону вращения.
Останов при условии, когда очередная величина Ео станет ниже некоторого порога.
« Последнее редактирование: Октябрь 14, 2015, 00:47 от popper » Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2094



Просмотр профиля
« Ответ #25 : Октябрь 14, 2015, 02:15 »

Думаю, что задачу можно описать без применения дифф. уравнений на основании закона сохранения энергии.
Путь начальная потенциальная энергия натянутой пружины Ео, тогда в некоторый момент времени t после начала движения должно выполняться:
Е(t)+Евращ_движ(t) + путь(t)*Апотерь = Ео,
где Е(t) - потенциальная энергия в текущей точке;
     Евращ_движ(t)  - энергия вращательного движения, определяемая через текущую угловую скорость движения центра масс;
     Апотерь - работа сил трения, в первом приближении постоянная величина, хотя, наверное, можно задать ее функцией скорости вращения, при этом немного усложнив уравнение.

Далее условие остановки в противоположной точке: Евращ_движ(t = tост) = 0.
Новое значение потенциальной энергии Ео' = Ео - полный_путь*Апотерь.
Затем вычисления повторяются в противоположную сторону вращения.
Останов при условии, когда очередная величина Ео станет ниже некоторого порога.
Не, здесь это не поможет..

Хотя, здесь вообще ничего не поможет, пока товарищь igors не научится грамотно формулировать постановку задачи, и то, как это решение представляется (по его мнению) быть интегрированно в конечный результат в рамках того инструментария, что используется.

Почти конец второй страницы, но покажите мне хоть одного, кто бы располагал всей необходимой информацией, чтоб посоветовать что-либо конструктивное.. И это не первый случай(
А потом слышишь в свой адрес:
Цитировать
Та я уже понял что кроме "фыркания" ничего не будет  Улыбающийся Теплилась слабая надежда, но увы, все как всегда   Плачущий
Отправлено: Октябрь 13, 2015, 13:01
или
Цитировать
Ну вот, наколотили понтов - а ведь все гораздо проще, и знание дифуров необязательно. Положим массу = 1, чтобы она не путалась под ногами..
Ну вы поняли, да..  Улыбающийся
« Последнее редактирование: Октябрь 14, 2015, 02:26 от m_ax » Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
AzazelloAV
Гость
« Ответ #26 : Октябрь 14, 2015, 14:31 »

Игорь, я же в этом мире не самый умный, вы согласны?
Ну, и вы, наверное тоже.
Самые умные посты не создают, как сделать.

Если вы заметили мои посты, то там был посыл не как сделать, а как другие делают и как красивей. У вас же ситуация в корне отличается. Вы не знаете предметной области, в которой работаете, поэтому вам даже трудно составить тех. задание (ТЗ) для топика.

Есть вход, есть выход. Это классика. Это классическая задача. Мы получили на входе одно, на выходе другое.
Ладно. Постараюсь объяснить на пальцах. Есть система. Считаем её замкнутой и нет там внешних воздействий.
Пусть есть кубик, на который действует пружина. Он в стабильном состоянии (сначало так система описывается).
А потом вы подали на него какой-то сигнал - сдвинули кубик. И ваш кубик начинает качаться бесконечно по синусоиде.
Отлично. Математическая модель закончилась.
У вас пружина не идеальна, чем больше растяжение, тем больше сопротивление. Каким стабильным коеффициентом вы это можете задать? Отбросим также вариант, когда пружина прекратит своё существование как пружина при предельных нагрузках.
Сила сопротивления (потеря энегрии). Что для вас потеря энергии? Она (в пружине) нелинейная, значит вы её не можете высчитать каким-то коэффициентом.
Она не описывается уравнением. А инертность тела, а сопротивление воздуха, а может ваше тело по столу ездит и там тоже нужно это учитывать?
Пока вы не опишите систему, не поймёте её....

Что же от вас, для самого себя требуется: 2 варианта.
Вариант 1.
1. Понять что такое дифуры (просто понять).
2. Узучить ТАУ.
3. Составить систему и изучать её переходные процессы.
4. Забить на эту задачу и поняв что стал вумный заняться более денежными вещами
На всё это отвожу минимум год.

Вариант 2.
В тематическом форуме забашлять кому-то, чтобы это описали через матан. Только чур про новые условия! (я не про себя забашлять)




« Последнее редактирование: Октябрь 14, 2015, 14:49 от AzazelloAV » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #27 : Октябрь 14, 2015, 16:57 »

Хотя, здесь вообще ничего не поможет, пока товарищь igors не научится грамотно формулировать постановку задачи, и то, как это решение представляется (по его мнению) быть интегрированно в конечный результат в рамках того инструментария, что используется.

Почти конец второй страницы, но покажите мне хоть одного, кто бы располагал всей необходимой информацией, чтоб посоветовать что-либо конструктивное.. И это не первый случай(
Вернемся к стартовому посту. Что собственно не так? Чего там не хватает? Нужны какие-то подробности движка? Ну что знаю могу сообщить, но я понимаю только его небольшую часть. Да и зачем они нужны - ясно что это интегрировано в pipeline движка, мне нужно рассчитать силу/момент - это "выход". А вход - пожалуйста, все данные на руках. Как и сказано в первом посте.

Так что же мешает танцору? Улыбающийся

Да, и вот что. Если на шипящую оканчивается существительное женского рода - нужен мягкий знак (мышь, чушь, печь). Но существительные мужского рода пишутся без него (малыш, товарищ). Пожалуйста будьте аккуратнее, такая ошибка может быть неверно понята  Улыбающийся

Что же от вас, для самого себя требуется: 2 варианта.
Вариант 1.
1. Понять что такое дифуры (просто понять).
2. Узучить ТАУ.
...
Ну а почему Вы считаете что я не понимаю дифуров и с ТАУ не знаком? Улыбающийся Только вот выходит не так уж все это нужно (см ниже)

Вариант 2.
В тематическом форуме забашлять кому-то, чтобы это описали через матан. Только чур про новые условия! (я не про себя забашлять)
Верю в Вашу бескорыстность. С удовольствием бы работал с математиком/физиком. Разумеется не безвозмездно для него. Но такая "связка" - дело очень тонкое. Начальный ход мысли у всех примерно одинаков "вот есть физики, они знают как и чего. Заплатим им денежку, они нам дадут формулы, мы их быстренько реализуем - вот и все".

Именно эту ошибку я сделал в начале 90-х, даже хуже - я обратился с этим к своему хорошему другу, и навсегда испортил с ним отношения Плачущий С тех пор такие попытки были еще не раз, и не два (нужда-то в физике возникает часто), но все они неизменно проходили по такому же сценарию. Обсуждение с m_ax в этой теме повторяет этот путь В ТОЧНОСТИ.

Беда - те самые гребаные "дифуры". Научный работник рисует дифур и решает его (мой друг делал "изгиб балки по Ландау"). Все, на этом он считает свою миссию выполненной. См выше - все то же самое. Вот и дифур, вот и набор решений, и даже плюс анализ с красивым графиком. А вот что же дальше...

Сначала оказывается что о "быстренькой реализации" мечтать не приходится - нужно вникнуть во все обозначения/термины (якобы) готового решения отнюдь непросто (кто такая гамма? и.т.п.). А их может быть наструячено десятки, тут теоретики не скупятся. Это здесь маленький, а бывают ого-го. Потом появляются подозрительные "коэффициенты" к которым надо (мучительно) подбирать дефаулты. 

Ну это еще цветочки. После того как удалось реализовать (если конечно удалось) и слегка потестить - выясняется что это все... не катит. Короче - с решенным дифуром АБСОЛЮТНО НЕХРЕН ДЕЛАТЬ. В данном случае мне нужно считать силу. как ее извлечь из решенного дифура? Хз, даже если бы удалось - вряд ли это бы работало хорошо "в дискретном мире движка". Напр x(t) я юзать не могу - позиция в движке определяется кучей факторов и может не иметь к колебаниям никакого отношения.

Поэтому я (мягко) говорю - не надо "дифуров", там всегда было "дубль-пусто", и, видимо, так будет всегда. Но кто ж меня послушает - они ведь так умны, а я и школьного курса не освоил  Улыбающийся
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4724



Просмотр профиля WWW
« Ответ #28 : Октябрь 14, 2015, 21:58 »

так надо обращаться не к чистым теоретикам, а к прикладникам, работающим с численными методами, которые и разностную схему для дифуров напишут, и дискретные условия устойчивости/схождения найдут, и т.д.
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
AzazelloAV
Гость
« Ответ #29 : Октябрь 14, 2015, 23:33 »

Верю в Вашу бескорыстность.
Не в бескорыстности дело, я просто этого не умею
Записан
Страниц: 1 [2] 3   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.099 секунд. Запросов: 22.