LINUX.ORG.RU

Рунге-Кутты в wxMaxima


0

1

Здравствуйте. У меня следующая проблема. Есть цикл от 1 до n, в каждой итерации 3 раза задаётся система 2 диф.ур-ний, и каждую систему он решает метод Рунге. При этом передаёт конечные значения решений, на вход начальных следующей системе. Например, sol:rk([f1,psi1],[psi1,psi],[psi1I,psiI],[tau,i-1,i-1+t1,h]), len:length(sol), tgI:sol[len][1], psiI:sol[len][3], psi1I:sol[len][2], Потом он эти значения psiI и psi1I передаёт на след. сис-му в качестве начальных и т.д.

Проблема заключается в следующем. Почему-то в некоторых итерациях он делает количество шагов на 1 меньше чем должно. Например, отрезок от 0 до 0.1 шаг 0.01, а он проходит всего 10 шагов. И соответственно передаёт не те значения. При чём может на i=1,4 посчитать неверное количество шагов, а на i=2,3 все верно.

Если кто-нибудь знает решение данной проблемы, буду премного благодарен.

Ответ на: комментарий от anonymous

Не совсем понял, что значит 0.01*10 > 0.1

Меня больше всего беспокоит то, что если скажем я задаю отрезок от 0 до 0.25 для 1й системы; от 0.25 до 0.75 для 2й; от 0.75 до 1 для 3й с тем же шагом h=0.01 Он все нормально считает(проходит именно столько шагов сколько нужно). А если от 0.25 заменить 0.1, а 0.75 заменить 0.9, то он начинает плохо работать. При чем такое ощущение, что Maxima произвольным образом считает открытая или закрытая граница(то есть явл. интервалом или отрезком), поэтому он то доходит до конца, то нет.

Если кто-нибудь знает решение данной проблемы, буду премного благодарен.

kopern1k
() автор топика
Ответ на: комментарий от ttnl

Кому на сессии дают решать диффуры методом Рунге-Кутты? К тому же там все руками решается :)

buddhist ★★★★★
()
Ответ на: комментарий от arkhnchul

У меня отрезок от 0 до 1 можно любым способом разбить. В том числе точками 0.1 и 0.9. В вашем случае я не имею права разбивать отрезок точками 0.1 до 0.90001, потому что отрезок [0.90001;1] не делится нацело на шаг 0.01.

Как мне кажется, тут загвоздка в том, что Maxima самопроивольно выбирает будет [0.9;1] или [0.9).

kopern1k
() автор топика
Ответ на: комментарий от ttnl

Это задача не имеет к сессии отношения. Я моделирую один пьезогироскоп, осованный на движении маленьких грузиков на них. Законы движения этих грузов я могу задавать. С синусами я реализовал программу, теперь хочу узнать, что будет если задавать кусочно-гладкими-линейными функциями. Дошел до момента, что Maxima мне все хорошо считает, если задавать кусочно-гладкую функцию при разбиении точками 0.25 и 0.75. Думал, что уже задача решена, только меняй параметры разбиения, а тут эта проблема, связанная именно с тонкостями реализации Рунге-Кутты в Maxima.

kopern1k
() автор топика
Ответ на: комментарий от kopern1k

Погрешность представления числа во float вполне может из 0.1 сделать, скажем, 0.10001, о чем выше и говорили.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

Я вообще задаю параметры как дробь, т.е. 1/10. Но даже, если как выше описывалось 0.1, то как решается эта проблема?

kopern1k
() автор топика
Ответ на: комментарий от kopern1k

ЧТОбы число итераций в цикле было правильным - использовать целые, от 1 до 10, а затем делить/умножать на сколько нужно.

unfo ★★★★★
()
Ответ на: комментарий от unfo

Вы неправильно поняли. У меня цикл от i:1 до n использует целые числа. Это Рунге проходит с шагом h=0.01 (который никак не зависит от i). sol:rk([f1,psi1],[psi1,psi],[psi1I,psiI],[tau,i-1,i-1+t1,h]) Вот в этой команде [tau,i-1,i-1+t1,h] обозначает по какой переменной идти, от чего до чего, и с каким шагом. Скажем, если у меня i=1, t1=0.25, h=0.01 То он должен сделать 26 шагов. Для 0.25 он делает все правильно, а для 0.1 может сделать 10, а может 11. При чем, скажем, для итерации i=1,3 он сделает правильно, а для i=2,4,5,6 он сделает неправильно.

kopern1k
() автор топика
Ответ на: комментарий от anonymous

Функция должна принимать в качестве аргументов начальное время, число шагов и величину каждого шага

anonymous
()
Ответ на: комментарий от kopern1k

Прочитал help к maxima

rk(t-x^2,x,1,[t,1.1,1.2,0.01]); [[1.1,1],[1.11,1.001039731147997],[1.12,1.002157858197583],[1.13, 1.00335280156957],[1.14,1.004623007754052],[1.15,1.005966948596246],[1.16, 1.007383120616393],[1.17,1.008870044362123],[1.18,1.010426263791787],[1.19, 1.012050345687275]] не хватает одного шага

rk(t-x^2,x,1,[t,1.1,1.2001,0.01]); [[1.1,1],[1.11,1.001039731147997],[1.12,1.002157858197583],[1.13, 1.00335280156957],[1.14,1.004623007754052],[1.15,1.005966948596246],[1.16, 1.007383120616393],[1.17,1.008870044362123],[1.18,1.010426263791787],[1.19, 1.012050345687275],[1.2,1.013740879094965]] все шаги

anonymous
()
Ответ на: комментарий от dave

Решено!

Действительно, оказалось, что к конечной точке надо прибавить величину меньшую, чем шаг. У меня вызывает это некоторый шок. Maxima как-то по странному определяет числа. Например, можно написать 0.00001 и Maxima выдаст 1.0000000000000001*10^-5 (непонятно откуда взялась единица на конце). А можно написать 0.000001 и Maxima выдаст 9.9999999999999995*10^(-7).

Я, если честно, так и не понял как задавать числа, чтобы Maxima правильно понимала(потому что я задавал все числа обыкновенными дробями, а результаты все равно был неверными).

Я пока что полностью не протестировал, но вроде бы конечные графики выводятся верными. Хотя остались недочёты(в каких-то случайных местах). Например, он первые 8 итераций делает правильно, а в 9 и 10 итерации считает точки 8.2 и 9.2 как 8.19999999999 и 9.1999999999. А на последующих опять все верно выводит. Непонятно почему так происходит.

Хотел поблагодарить всех, кто помог решить данную проблему!

P.S. Ответьте, пожалуйста, на еще один вопрос. Если у меня отрезок [0, 1.001], а шаг 0.01, то Рунге-Кутты проходит до 1, потом проверяет может он сделать еще один шаг и либо останавливается, либо продолжает? Или он как-то по-другому проходит шаги?

kopern1k
() автор топика
Ответ на: комментарий от dave

Тоже сработает

rk(t-x^2,x,1,[t,1.1,1.2001,0.01]);

[[1.1,1],[1.11,1.001039731147997],[1.12,1.002157858197583],[1.13, 1.00335280156957],[1.14,1.004623007754052],[1.15,1.005966948596246],[1.16, 1.007383120616393],[1.17,1.008870044362123],[1.18,1.010426263791787],[1.19, 1.012050345687275],[1.2,1.013740879094965]]

anonymous
()
Ответ на: комментарий от anonymous

Не то вставил. Надо

rk(t-x^2,x,1,[t,1.1,1.205,0.01]);

anonymous
()
Ответ на: Решено! от kopern1k

В конце (P.S.) всё правильно

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

anonymous
()
Ответ на: Решено! от kopern1k

Просто когда числа переводятся из десятичной системы в двоичную, то там там могут появляться периоды. Здесь на ЛОРе уже были казусы :)

dave ★★★★★
()
Ответ на: комментарий от anonymous

Спасибо всем за ответы. Если будут еще вопросы- задам=)

kopern1k
() автор топика
Ответ на: Решено! от kopern1k

Maxima как-то по странному определяет числа

Это не баг, это фича компьютерной арифметики.

no-such-file ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.