Форум
» Назад на решение задач по физике и термеху
Регистрация | Профиль | Войти | Забытый пароль | Присутствующие | Справка | Поиск

» Добро пожаловать, Гость: Войти | Регистрация
    Форум
    Математика
        1.25 Стереометрия
Отметить все сообщения как прочитанные   [ Помощь ]
» Добро пожаловать на форум "Математика" «

Переход к теме
<< Назад Вперед >>
Несколько страниц [ 1 2 3 4 5 6 7 8 9 10 11 ]
Модераторы: Roman Osipov, RKI, attention, paradise
  

MEHT



Долгожитель

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

Я то прорешивал так сказать вручную - искусственно суживал интервал почти до точки при высокой точности рассчётов в настройках, поэтому в результатах не сомневаюсь.


Я бы Вам посоветовал искать корни методом последовательных приближений - это самое простое что приходит на ум (не углубляясь в дебри численных методов).

Сначала определяете функцию f-(x,a,b) ту, что я определял ранее. Можете обозвать её по-своему, она нужна только для удобства, чтоб лишний раз не прописывать одно и то же. В ней можно выбросить знак "минус" в индексе, поскольку в дальнейшем функция с "плюсом" нам нигде не пригодится.

Т.е. надо численно прорешать уравнение



Делим его на произведения корней (при этом схождение метода будет быстрее) и прибавляем к левой и правой части по иксу




Правую часть удобно обозначить как функцию



Если теперь подставить в правую часть x=0 мы получим первое приближение нашего корня



далее



По мере увеличения n точность корня повышается.

Я оставляю без доказательства то, что при последовательных подстановках этих иксов корень стремится к нашему искомому. Для этого надо доказывать, что функция F есть так называемая "сжимающая функция" на интервале искомого корня.

Ну, на практике этот метод работает, поэтому и пользуемся.


Вам следует написать простенький цикл:
изначально присвоить x значение 0,
а потом проверяя условие

while |F(x,a,b,c) - x| > 0.000000000001    (тут сами выбираете какой точности корень Вам нужен),
присваиваете x значение F(x,a,b,c).

Цикл будет длиться до тех пор, пока корень не окажется равным указанному по точности в условии.
По окончании выводите x (или даже лучше F(x,a,b,c) как более точное значение) или arccos(x/a)∙180/п если хотите результата в углах.

---

Каюсь, я проглядел один момент: при минимальной длине a и максимальной b, длину c вывернуть на максимум не получится - где-то при c=215.1/120 начнёт исчезать наш корень. (Именно потому то и незаметил, что эта критическая длина близка к максимальной.) А это означает, что достигнув этой длины решение претерпевает двоение: далее увеличивать длину актуатора невозможно, а вот уменьшить её можно уже по двум разным путям - с разными изменениями углов.

Лучше бы этого избежать - скажем чуть-чуть урезав максимальную длину до 215. В противном случае попрёт вся та чехорда с "перескоками" на другие решения.

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


(Сообщение отредактировал MEHT 14 июля 2012 19:30)

Всего сообщений: 1548 | Присоединился: июнь 2005 | Отправлено: 14 июля 2012 18:22 | IP
thunder87l



Новичок

А, догнал в чём разница.

Я выражал y, находил x(y) и z(y), и потом подставлял в F(x,z). Но не в изначальную функцию, а в преобразованую, где мы избавились от радикалов.

С другой стороны - сейчас попробовал подставить в ту, в которую надо, и корней на графике вообще не вижу (158/158/158). Вчера пробовал через solve - получился комплексный корень. Наверняка что-то где-то пропустил. Посижу сегодня, почешу репку - авось найду где ошибся.

Всего сообщений: 29 | Присоединился: июнь 2012 | Отправлено: 15 июля 2012 19:44 | IP
thunder87l



Новичок

Нашёл где натупил. Когда переписывал в матлаб формулу, забыл при переносе один знак поменять. Сейчас даёт корни.

Что ещё я попробовал. Метод который вы предложили, со сжимающей функцией.. Что-то такое припоминаю из курса численных методов. Немного смутно потому, что препода по теории каждые десять минут сносило на смысл жизни и восхищения тем как всё в природе хитро устроено. Common disease  среди теоретиков ))

Мне таки более понятен метод поиска - разбил Х на 20 частей, нашёл пересечение графика с Ох, взял левую точку за начало, правую за конец. Повторять пока не надоест. Так вот я подумал - если уж y подставлять численный, зачем x(y) и z(y) подставлять в F(x,z), когда можно x(y) подставить в F(x,y) - всё равно корни должны бы быть одинаковыми, а вычислений на 30% меньше.

Может есть противопоказания?

Всего сообщений: 29 | Присоединился: июнь 2012 | Отправлено: 15 июля 2012 20:20 | IP
thunder87l



Новичок

Нашёл vpa toolboxв матлабе. Позволяет поднять точность рассчётов на столько, на сколько надо. Сделал все числа по 1000 чисел.

Сдаётся мне - не в точности проблема.

(Сообщение отредактировал thunder87l 16 июля 2012 13:54)

Всего сообщений: 29 | Присоединился: июнь 2012 | Отправлено: 16 июля 2012 0:46 | IP
MEHT



Долгожитель

Напрасно Вы так длинно расписали - топик разнесло по сторонам. Пожалуйста, подредактируйте.

Такой "точностью" в настройках Вы только увеличили количество значащих цифр после запятой, но результат то всё равно остался неточным. Ну сами подумайте, как могут получится разные углы для "параллельного" случая a=b=c=158/120 ?

Ещё раз подчёркиваю - не поддавайтесь иллюзии идеальности встроенного решателя. Испробуйте приведённую мной выше схему поиска - там по крайней мере точность корня явно прописывается в условии цикла. Всё что нужно - это задать изначально функцию f(x,a,b), потом через неё определить функцию F(x,a,b,c) и прописать цикл по нахождению корня. Найдя его, Вы найдёте y и z через

y=f(x,a,b),
z=f(x,a,c).

В маткаде, например, это прописывается в несколько строчек. Если Вы им пользуетесь, я бы мог выслать рабочий лист расчётов.

(Сообщение отредактировал MEHT 16 июля 2012 13:21)

Всего сообщений: 1548 | Присоединился: июнь 2005 | Отправлено: 16 июля 2012 13:19 | IP
thunder87l



Новичок

"Ну сами подумайте, как могут получится разные углы для "параллельного" случая a=b=c=158/120 ? "

В том-то и дело, что должны быть одинаковыми. Вроде как надо проверить рассчёты - авось где знак спутал - очень уж подозрительно получается. Ваш метод я конечно попробую. Точнее - уже один раз попробовал и корень ушёл в очень большие комплексные числа. Но это у меня по первому разу всегда так ))

Всего сообщений: 29 | Присоединился: июнь 2012 | Отправлено: 16 июля 2012 14:04 | IP
thunder87l



Новичок

Теперь работает. Как и думал - дело тут далеко не в точности вычислений матлаба.

Есть у меня нехорошее свойство - не люблю пользоваться чужими рассчётами. И в общем то - не плохо, если бы оно не проявлялось одновременно с невнимательностью в этих самых рассчётах ))

Подумал - раз у вас работает, значит я где-то натупил. Переписал ваше выражение корня f(x,a,b), вытащил оттуда коэфициенты, сравнил со своими и ВНЕЗАПНО - там где у вас 1.5 у меня 3, где корень - там у меня два корня.. Короче судя по всему - в какой-то момент сократил двойку, но забыл стереть.

Теперь всё работает как негр на плантации. Например случай с a=158, b=158, c=198.

Elapsed time is 17.404131 seconds.
alpha = 83.706389339979197
beta = 83.706389339979268
gamma = 81.935740364853615

ваш результат:
α = β ≈ 83°42'23" = 83.7063889°
γ ≈ 81°56'09" = 81.9358333°

Это у меня метод поиска - 20 проходов, по 20 делений на отрезке от pi/4 до pi/2. Если не ошибаюсь, получается точность - (pi/2-pi/4)/20^20.

Потом ещё ваш попробую как-нибудь, но тут есть одно но. Кажется вы писали, что близко к критической точке вычисления занимают больше времени. Значит - будет трудновато оценить как долго будет считаться таблица. Этот-же метод даёт точность выше приемлемой и выполняется одинаковое количество времени. Можно подогнать например, чтобы за час всё отрешал.

Вот. Теперь и вычисления работают. Можно теперь идти и дальше искать откуда взялась ошибка в рассчётах ))

Всего сообщений: 29 | Присоединился: июнь 2012 | Отправлено: 16 июля 2012 19:12 | IP
thunder87l



Новичок

Интересненькое. Прогнал 13х13х13, получил результаты. Взял  θ как у вас.

Снизу - один из уровней получившегося куба. Один из актуаторов находится в минимальном положении, остальные два - переменные.



Очевидно что 67 градусов - максимальное отклонение. Отсюда я делаю вывод, что всё что выше 67 градусов - баг вычислений вызваный тем, что система в этой точке не сходится. Ваше мнение?

Вообще-по хорошему во время вычислений надо бы проводить проверку - сходится ли она и не находится ли в какой-нибудь критической точке.

Собственно что интересно. Надо напрограмить функцию ищущую самый короткий путь из одного положения в другое, обходя запрещённые состояния. Это забавно. Несколько раз писал функции нахождения пути для игр, но как правило - двухмерные, и никогда не думал что 3D-pathfinding может пригодиться где-то кроме 3D игр.

Вторая хитрая мысль - сделать простую леталку в этом кубе решений. Запрещённые состояния сделать стенками и подключить девайс к игре )) Ты перелетаешь из одной клетки в другую - меняются положения актуаторов. Это может быть очень забавно ))

Всего сообщений: 29 | Присоединился: июнь 2012 | Отправлено: 18 июля 2012 15:38 | IP
MEHT



Долгожитель


Потом ещё ваш попробую как-нибудь, но тут есть одно но. Кажется вы писали, что близко к критической точке вычисления занимают больше времени. Значит - будет трудновато оценить как долго будет считаться таблица. Этот-же метод даёт точность выше приемлемой и выполняется одинаковое количество времени. Можно подогнать например, чтобы за час всё отрешал.
Так сам метод перестанет работать при приближении корня к критическому.
График в при "критической" длине уже не сечёт, а касается оси абсцисс, а при малейшем увеличении параметра (выход за пределы "критического") корней уже нет. Поэтому я и предлагал занизить величину максимума актуаторов до 215.
Пока мы работаем в дозволенных рамках изменений параметров всё вычисляется примерно одинакого быстро.


У меня в настройках максимальная точность - до 15-го знака после запятой; соответственно и погрешность следует выбирать не меньше чем до 15-го знака.
Пусть будет 0.000 000 000 000 1

Вот пример такого расчёта (скриншот маткада):

Функциональная часть:



картинку малость урезал (формула f(x,a,b) не влезла).
Тут y и z выражены через такое же соотношение, что и x (циклическая перестановка параметров).
Но можно было и так, как предлагал выше - через f(x,a,b), просто в первом случае погрешность y и z такая же как и у икса. Ну и заменил l на k - лучше смотрится.


Вычислительная часть: тут всё просто - задаём параметры, получаем ответ



Не смущайтесь, что в θ вкралась мнимая единица - это произошло из-за того, что косинус cos θ чуть-чуть (в 15-м знаке) превысил единицу из-за погрешностей в x,y,z. При заданной погрешности это вполне естественный результат - точность угла будет до 6-го знака:

(180/п)∙acos(1.00000000000001) = 0.00000809960798159i

----

С таблицей поаккуратней - не забывайте, что 215.1 - "критическая" длина для фиксированного минимального параметра,
поэтому последняя строка и столбец уже заведомо неверны - там нет корней.

Разбиваем интервал от 158 до 218 на 13 равных частей, но строим матрицу 12 на 12 (не просчитывая крайние строки и столбцы полной таблицы 13 на 13). Тогда:



i и j в матричном элементе g пробегают значения от 0 до 11.


(Сообщение отредактировал MEHT 19 июля 2012 18:21)

Всего сообщений: 1548 | Присоединился: июнь 2005 | Отправлено: 19 июля 2012 18:12 | IP
thunder87l



Новичок

Так. Выходит тут ещё разбираться и разбираться. Я надеюсь - не слишком утомил? Другой раз чушь несу и сам уже после понимаю, что это чушь, но тем не менее.

Напрягло меня, что у вас таблица без ужасов, а у меня - с ними. Причём - много их. Сделал я тестик - из своих x,y,z добыл углы, и занялся простой геометрией - построить точки D,E,F по углам и соответствующим им длиннам актуаторов. Затем проверил - сходится ли система - нашёл длинну DE, EF, FD и сравнил с тем что должно получаться. Во всех "неправильных положениях" у меня выходит что длинны несовпадают иногда довольно сильно.

Вот прога:

L=120; l=90; MIL=158; AS=60; MAS=13;
cnt_a=1; cnt_b=6; cnt_c=8;

x=x0(cnt_a,cnt_b,cnt_c);
y=y0(cnt_a,cnt_b,cnt_c);
z=z0(cnt_a,cnt_b,cnt_c);

a=MIL+AS*(cnt_a-1)/(MAS-1);
b=MIL+AS*(cnt_b-1)/(MAS-1);
c=MIL+AS*(cnt_c-1)/(MAS-1);

alpha = acos(x*L/a);
beta  = acos(y*L/b);
gamma = acos(z*L/c);

A=[   0,  sqrt(3)*L/3, 0];
B=[-L/2, -sqrt(3)*L/6, 0];
C=[ L/2, -sqrt(3)*L/6, 0];
D=[  0                            ,  sqrt(3)*L/3 - a*cos(alpha)   , a*sin(alpha) ];
E=[ -L/2 + sqrt(3)*b*cos(beta)/2  , -sqrt(3)*L/6 + b*cos(beta)/2  , b*sin(beta)  ];
F=[  L/2 - sqrt(3)*c*cos(gamma)/2 , -sqrt(3)*L/6 + c*cos(gamma)/2 , c*sin(gamma) ];

len_1=sqrt( (D(1)-E(1))^2 + (D(2)-E(2))^2 + (D(3)-E(3))^2 )
len_2=sqrt( (F(1)-E(1))^2 + (F(2)-E(2))^2 + (F(3)-E(3))^2 )
len_3=sqrt( (D(1)-F(1))^2 + (D(2)-F(2))^2 + (D(3)-F(3))^2 )

MIL - минимальная длинна актуатора
AS - насколько он выдвигается
MAS - сколько шагов

Например, у меня среди странных есть такая точка (2,5,9) где тоже всё не сходится. Её возможно достать если уменьшить длинну актуаторов, как вы предлагаете.

Я распишу что у меня получается, вы потом можете написать что у вас в этой точке - для сравнения.

x =  0.960486711111727
y = -0.037943788725351
z =  0.284071618983397

a = 163
b = 178
c = 198

alpha =   0.785398163397448
beta =     1.596379199584508
gamma = 1.397769648548632

len_1 =  90
len_2 =  97.883681272852328
len_3 =  89.999999999999986

Всего сообщений: 29 | Присоединился: июнь 2012 | Отправлено: 19 июля 2012 23:40 | IP

Отправка ответа:
Имя пользователя   Вы зарегистрировались?
Пароль   Забыли пароль?
Сообщение

Использование HTML запрещено

Использование IkonCode разрешено

Смайлики разрешены

Опции отправки

Добавить подпись?
Получать ответы по e-mail?
Разрешить смайлики в этом сообщении?
Просмотреть сообщение перед отправкой? Да   Нет
 

Переход к теме
<< Назад Вперед >>
Несколько страниц [ 1 2 3 4 5 6 7 8 9 10 11 ]

Форум работает на скрипте © Ikonboard.com