Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Сплайн решение ДУ (MatLab, SciLab)  (Прочитано 5080 раз)
0 Пользователей и 1 Гость смотрят эту тему.
maksim.s
Интересующийся

ru
Offline Offline

« : 10-05-2012 15:31 » 

Здравствуйте.
Проблема в следующем. Мне нужно получить решение ОДУ в виде сплайна. Очевидный путь - получить значения функции в наборе точек посредством ode45(..), сшить эти точки сплайном spline(..).
Этот способ мне не нравится по 2 причинам. Для построения сплайна необходимо знать значения функции и производной в точках. Эти значения при решении ДУ мы, вообще говоря, рассчитываем. То есть нет никакого смысла вызывать функцию spline(..). Во-первых, это оверхед (чёрт с ним), во вторых, что более важно, функция spline(..) не использует информацию о значении производной функции (а ведь она очень полезна), а "угадывает" значение производной сама. В связи с этим увеличивается ошибка полученного решения.
Для пояснения своей мысли приведу пример (написан на scilab'e, нет большой разницы с matlab'ом - функции аналогичны):

Код:
////////////////////////////////////
// solve DE x' = -x^2
function [dx] = rhs(t, x)
    dx = - x ^ 2;
endfunction

////////////////////////////////////
// solving...
t = [0:0.1:1]';
func_values = ode(1, 0, t, rhs)';

////////////////////////////////////
// take a spline
deriv_values = rhs(t, func_values);
deriv_values2 = splin(t, func_values);

function y = f1(q)
    y = (interp(q, t, func_values, deriv_values) - 1 ./ (1 + q))^2;
endfunction

function y = f2(q)
    y = (interp(q, t, func_values, deriv_values2) - 1 ./ (1 + q))^2;
endfunction

// calculate integral quadratic error
disp(intg(0, 1, f1)); // err = 1.648D-12
disp(intg(0, 1, f2)); // err = 9.577D-11

То есть если я вычисляю коэффициенты сплайна "вручную", то квадратичная ошибка получается на 2 порядка меньше, нежели при вызове функции spline(..).
Собственно вопрос: как в данной ситуации лучше поступить? Умеет ли функция ode45(..) возвращать помимо набора значений функции ещё и набор значений производной? Или же сразу структуру, описывающую сплайн? Или, может, помимо ode45 существуют более удобные функции?
« Последнее редактирование: 10-05-2012 15:40 от maksim.s » Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines