2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 Поиск коэффициентов полинома в Mathematica
Сообщение24.04.2016, 12:26 
Я могу ручками сделать, это просто. Но начал возится с mathematica и хочется понять как это там сделать легко и правильно.

Задача. Допустим есть обычный сплайн Эрмита (кубический полином). Немного распишу что там да как, что бы не лазить никуда при чтении. Что бы найти его коэффициенты вводят условия.

1. В начальной и конечной точке значение сплайна равно точке. (координатам естественно).
2. Первая производная задана на концах сплайна.

Полином вида $r(t)=at^3+bt^2+ct+d$
Векторная запись, где $a,b,c,d$ искомые коэффициенты.
Координаты точек это $p=\{x,y,z\}$

Для нахождения коэффициентов находим первую производную полинома и составляем матрицу.
\qquad
\begin{bmatrix}
1 & 1 & 1 & 1 \\
1 & 1 & 1 & 1 \\
3 & 2 & 1 & 0\\
3 & 2 & 1 & 0\\
\end{bmatrix}
\qquad

Первая строка это коэффициенты для первой точки. Вторая для второй, третья это первая производная для первой точки и четвертая, для второй. Запишем матрицу как $A$. Решая систему относительно коэффициентов $a,b,c,d$. Таким образом коэффициенты найдены и можно записать полиномиальную форму сплайна Эрмита.

Вот кратенько то, что надо записать на mathematica. Проблемы следующие:
1. Как достать коэффициенты полинома и производных, и записать матрицу?
2. Как записать систему уравнений с коэффициентами полинома и производных, и решить?

Или может я вообще не понимаю как решать такую задачу в mathematica и надо что то совсем простое сделать? Но. Задачка просто пример, так что готовые функции для интерполяции мне не подойдут надо именно решить систему и пр.

Я конечно могу просто взять, записать матрицу коэффициентов ручками и найти $A^{-1}$, но хочется что бы ввел в начале программы точки и граничные условия для полинома, он сам все производные нашел, показал, потом матрицу составил, нашел $A^{-1}$, потом показал решение в виде полиномиальной записи. Потом по точкам построил этот сплайн. Я так понимаю все эти вещи буквально несколькими строчками можно записать если понимать как верно это сделать.

 
 
 
 Re: Поиск коэффициентов полинома в Mathematica
Сообщение24.04.2016, 12:46 
Coefficient[p, x, n] даст коэффициент при $x^n$ в $p$. CoefficientList[p, x] даст список коэффициентов при $x^0,x^1,\ldots$.

Если я правильно понял, матрицу вам составлять и коэффициенты выбирать совершенно не обязательно, можно уравнения собрать и так. Вот такой код всё найдёт, потом можно с его результатом сделать что-нибудь дополнительно.
Код:
coeffs = Table[a[i], {i, 0, 3}];
poly[t_] = Sum[a[i] t^i, {i, 0, 3}];
eqs = {poly[0] == p0, poly[1] == p1, poly'[0] == v0, poly'[1] == v1};
Solve[eqs, coeffs]

Вывод, для проверки, такой:
Код:
{{a[0] -> p0, a[1] -> v0, a[2] -> -3 p0 + 3 p1 - 2 v0 - v1, a[3] -> 2 p0 - 2 p1 + v0 + v1}}

 
 
 
 Posted automatically
Сообщение24.04.2016, 13:03 
Аватара пользователя
 i  Тема перемещена из форума «Околонаучный софт» в форум «Карантин»
по следующим причинам:

- неправильно набраны формулы (краткие инструкции: «Краткий FAQ по тегу [math]» и видеоролик Как записывать формулы).

Исправьте все Ваши ошибки и сообщите об этом в теме Сообщение в карантине исправлено.
Настоятельно рекомендуется ознакомиться с темами Что такое карантин и что нужно делать, чтобы там оказаться и Правила научного форума.

 
 
 
 Posted automatically
Сообщение24.04.2016, 15:35 
 i  Тема перемещена из форума «Карантин» в форум «Околонаучный софт»

 
 
 
 Re: Поиск коэффициентов полинома в Mathematica
Сообщение24.04.2016, 15:41 
Да, я руками прописал матрицу, потом ее инверсную получил и умножил, ответы совпадают. Но ваш код
просто глаза открыл на то как надо писать :) Спасибо большое!

Еще один вопрос тогда. Каким образом из решения, состоящего из матрицы коэффициентов собрать полином и его нарисовать на экране? Тут я опять кинулся ручками записывать полином, а как рисовать вообще еще не понял, так как мне надо для сплайна задать точки и касательные и это как то шибко сложно выходит.

Вопросы наверное глупые, но я только пытаюсь понять общие принципы написания подобных вещей.

И еще мне надо потом итоговый полином с заданными точками и касательными взять и получить производную в произвольной точке полинома.

Вообще то сама задачка уже решена в тот момент когда коэффициенты найдены, писать потом я это все буду на java, но хотелось бы видеть как это правильно сделать на wolfram, на будущее.

 
 
 
 Re: Поиск коэффициентов полинома в Mathematica
Сообщение24.04.2016, 16:25 
3DRaven в сообщении #1117948 писал(а):
Еще один вопрос тогда. Каким образом из решения, состоящего из матрицы коэффициентов собрать полином и его нарисовать на экране?
Должно сработать coeffsMat . Table[t^i, {i, 0, 3}] или Transpose[coeffsMat] . Table[t^i, {i, 0, 3}] — смотря как матрица получается.

Чтобы построить параметрическую кривую, используйте ParamtericPlot (для двумерной) или ParametricPlot3D (здесь вторую, конечно, но и первая может пригодиться!). Тут это будет ParametricPlot3D[что-то от t, {t, 0, 1}].

Кстати, если читаете по-английски, смело жмите F1 — справка довольно подробная. Есть даже страницы с функциями и их опциями по разным темам.

И ещё может быть полезным знать, что Solve, раз уж я её упоминал, выдаёт результаты в таком виде, чтобы можно было подставить их в какое-нибудь выражение, включая искомый многочлен: если к коду выше добавить
Код:
poly[t] /. %[[1]]
(% — предыдущий результат), получится сразу p0 + t v0 + t^2 (-3 p0 + 3 p1 - 2 v0 - v1) + t^3 (2 p0 - 2 p1 + v0 + v1) без нужды выделять из ответа коэффициенты и умножать на степени t вручную.

Хотя не все вещи делаются так просто, конечно.

 
 
 
 Re: Поиск коэффициентов полинома в Mathematica
Сообщение24.04.2016, 17:08 
Я решение начал умножать на {t^3,t^2,t,1} В общем совсем куда то не туда пошел :) Буду разбираться, направление видно. Спасибо!

-- Вс апр 24, 2016 18:27:43 --

Даже что то начертил! :)
Код:
Clear["Global`*"];
coeffs = Table[a[i], {i, 0, 3}];
poly[t_] = Sum[a[i] t^i, {i, 0, 3}]
eqs = {poly[0] == p0, poly[1] == p1, poly'[0] == v0, poly'[1] == v1}
sol = Solve[eqs, coeffs]
sub[t_] = poly[t] /. sol[[1]]
p0 = {0, 0, 0};
p1 = {1, 1, 0};
v0 = {0, 0, 0};
v1 = {1, 1, 1};
ParametricPlot3D[{sub[t]}, {t, 0, 1}]


Правда половину написанного я понимаю только немного :) Буду разбираться постепенно.

 
 
 [ Сообщений: 7 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group