Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Апроксимация. Помогите найти ошибку. / 13 сообщений из 13, страница 1 из 1
31.10.2006, 15:41
    #34094702
Апроксимация. Помогите найти ошибку.
Функция задана по точкам.
Например,

x1=1, y1=5
x2=2, y2=7
x3=3, y3=9
...

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

Итак.

Пусть есть у нас две точки А (x1,y1) и Б (x2,y2), через которые проходит функция. Кроме того, мы знаем первые производные в этих точках.

Составляю систему:

a0 + a1*x1 + a2*x1^2 + a3*x1^3 = y1
a0 + a1*x2 + a2*x2^2 + a3*x2^3 = y2
0 + a1 + 2*a2*x1 + 3*a3*x1^2 = dy1/dx1 {это производная в точке А}
0 + a1 + 2*a2*x2 + 3*a3*x2^2 = dy2/dx2 {это производная в точке Б}

Так вот. У меня эта система получается линейно-зависимой.
Не получается привести ее к треугольному виду (для решения методом Гаусса).
После преобразований последние два уравнения принимают, например, такой вид:
0 0 1 7 5
0 0 3 21 6
То есть попытка вычесть из одного уравнения к другому приводит к тому, что в последнем уравнении получаются все нули (кроме свободного члена)

Другими словами получается такая матрица:

1 x x x
0 1 x x
0 0 1 x
0 0 0 0

Подскажите, пожалуйста, в чем дело?
...
Рейтинг: 0 / 0
31.10.2006, 16:02
    #34094815
zz118
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Апроксимация. Помогите найти ошибку.
Не решайте дифуры Гауссом. Юзайте Коши.
...
Рейтинг: 0 / 0
31.10.2006, 16:13
    #34094859
Апроксимация. Помогите найти ошибку.
zz118Не решайте дифуры Гауссом. Юзайте Коши.

Да тут дело, похоже, не в методе, а в исходных данных.
Определитель такой системы равен нулю (в маткаде проверил). Решения не найти.
Но почему?
Неужели по двум точкам и первых производных в них нельзя найти функцию???
...
Рейтинг: 0 / 0
31.10.2006, 16:18
    #34094889
zz118
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Апроксимация. Помогите найти ошибку.
1. Метод Гаусса - решение линейных систем, Формула Коши - дифуры.
2. Достаточно полинома второй степени: правильный ответ - парабола.
3. Если точек много, то нужно юзать полиномы Лагранжа. кол-во точек = степень полинома.
...
Рейтинг: 0 / 0
31.10.2006, 16:23
    #34094923
Апроксимация. Помогите найти ошибку.
zz1181. Метод Гаусса - решение линейных систем, Формула Коши - дифуры.
2. Достаточно полинома второй степени: правильный ответ - парабола.
3. Если точек много, то нужно юзать полиномы Лагранжа. кол-во точек = степень полинома.

Ну хорошо. Тогда Коши тут ни при чем совсем. У меня система линыйных уравнений. Посмотрите, пожалуйста, выше. Производная там уже вычислена и подставлена в виде числа.
...
Рейтинг: 0 / 0
31.10.2006, 16:33
    #34094981
zz118
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Апроксимация. Помогите найти ошибку.
интересно, из каких соображений она вычислена?
...
Рейтинг: 0 / 0
31.10.2006, 16:35
    #34094993
Sandro_K
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Апроксимация. Помогите найти ошибку.
Федор_Федор zz1181. Метод Гаусса - решение линейных систем, Формула Коши - дифуры.
2. Достаточно полинома второй степени: правильный ответ - парабола.
3. Если точек много, то нужно юзать полиномы Лагранжа. кол-во точек = степень полинома.

Ну хорошо. Тогда Коши тут ни при чем совсем. У меня система линыйных уравнений. Посмотрите, пожалуйста, выше. Производная там уже вычислена и подставлена в виде числа.

Может я че прогоняю, но как можно вычислить и подставить в виде числа производную неизвестной функции?
...
Рейтинг: 0 / 0
31.10.2006, 16:38
    #34095006
Sandro_K
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Апроксимация. Помогите найти ошибку.
a0 + a1*x1 + a2*x1^2 + a3*x1^3 = y1
a0 + a1*x2 + a2*x2^2 + a3*x2^3 = y2
a0 + a1*x3 + a2*x3^2 + a3*x3^3 = y3

надо просто решить эту систему кубических алгебраических (не дифференциальных!) уравнений
...
Рейтинг: 0 / 0
31.10.2006, 16:40
    #34095025
Апроксимация. Помогите найти ошибку.
Sandro_K
Может я че прогоняю, но как можно вычислить и подставить в виде числа производную неизвестной функции?
Ну здорово...
Вы шутите?
Мы можем не знать функцию, но задать, что в точке с координатами, например, (x1,y1), производная равна нулю (в этой точке перегиб).
Или можем задать, что производная равна единице (в этой точке касательная идет под углом 45 градусов).
И т.д.
У меня есть две точки. Через две точки можно провести бесконечное число парабол, кстати. Я задаю дополнительные параметры - касательные (производные) в этих точках. Касательные определяются, хотя это не важно, по другим, соседним, точкам.
Это не я придумал.
Посмотрите, например, тут:
http://www.enlight.ru/demo/faq/smth.phtml?query=alg_curves_splines
Первая страничка.
...
Рейтинг: 0 / 0
31.10.2006, 16:52
    #34095077
zz118
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Апроксимация. Помогите найти ошибку.
RTFM: интерполяционные полиномы
...
Рейтинг: 0 / 0
31.10.2006, 16:57
    #34095106
Апроксимация. Помогите найти ошибку.
Sandro_Ka0 + a1*x1 + a2*x1^2 + a3*x1^3 = y1
a0 + a1*x2 + a2*x2^2 + a3*x2^3 = y2
a0 + a1*x3 + a2*x3^2 + a3*x3^3 = y3

надо просто решить эту систему кубических алгебраических (не дифференциальных!) уравнений

Число линейно-независимых уравнений должно быть равно числу неизвестных. По-моему, это 9 класс.

А я уже ошибку нашел. Просто глупейшая ошибка. Когда набирал текст, забыл коэффициенты... Устал просто... Потом не заметил.

Всем спасибо за помощь. Все работает.
...
Рейтинг: 0 / 0
31.10.2006, 16:59
    #34095117
Sandro_K
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Апроксимация. Помогите найти ошибку.
Как я понял ты пытаешься делать интерполяцию сплайнами, извини, сразу не догнал

Твоя систему уравнений правильная, только непонятно как ты ее решаешь и она должна решаться нормально
...
Рейтинг: 0 / 0
31.10.2006, 18:49
    #34095559
Апроксимация. Помогите найти ошибку.
Sandro_KКак я понял ты пытаешься делать интерполяцию сплайнами, извини, сразу не догнал

Твоя систему уравнений правильная, только непонятно как ты ее решаешь и она должна решаться нормально
Да, виноват, просто в коде сделал ошибку, смотрел на нее, как баран на новые ворота три часа...
...
Рейтинг: 0 / 0
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Апроксимация. Помогите найти ошибку. / 13 сообщений из 13, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]