Russian Qt Forum
Апрель 18, 2024, 16:41 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: [Решено]Дискретный оператор Лапласа и числовой градиент.  (Прочитано 6425 раз)
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« : Апрель 23, 2019, 14:24 »

Всем привет,

мож кто сталкивался... Видел/использовал кто какую-нить опен-сорс библиотеку в которой есть аналоги Matlab-овских ф-й:

* del2
* gradient

нужны преобразования в "реальном времени" для размерности 1-D.

Для дискретного лапласа "надыбал" эти сорцы.

Код:
double *l1pp_apply ( int n, double h, double u[] )

/******************************************************************************/
/*
  Purpose:

    L1PP_APPLY applies the 1D PP Laplacian to a vector.

  Discussion:

    The N grid points are assumed to be evenly spaced by H.

    For N = 5, the discrete Laplacian with periodic boundary conditions
    on [0,6] has the matrix form L:

       2 -1  0  0 -1
      -1  2 -1  0  0
       0 -1  2 -1  0
       0  0 -1  2 -1
      -1  0  0 -1  2

  Licensing:

    This code is distributed under the GNU LGPL license.

  Modified:

    30 October 2013

  Author:

    John Burkardt

  Parameters:

    Input, int N, the number of points.
    N must be at least 3.

    Input, double H, the spacing between points.

    Input, double U[N], the value at each point.

    Output, double L1PP_APPLY[N], the Laplacian evaluated at each point.
*/
{
  int i;
  double *lu;

  if ( n < 3 )
  {
    fprintf ( stderr, "\n" );
    fprintf ( stderr, "L1PP_APPLY - Fatal error!\n" );
    fprintf ( stderr, "  N < 3.\n" );
    exit ( 1 );
  }

  lu = ( double * ) malloc ( n * sizeof ( double ) );

  i = 0;
  lu[i] = ( - u[n-1] + 2.0 * u[i] - u[i+1] ) / h / h;
  for ( i = 1; i < n - 1; i++ )
  {
    lu[i] = ( - u[i-1] + 2.0 * u[i] - u[i+1] ) / h / h;
  }
  i = n - 1;
  lu[i] = ( - u[i-1] + 2.0 * u[i] - u[0] ) / h / h;

  return lu;
}
/******************************************************************************/

вроде это что-то похоже на то что нужно, судя по этой доке.

Но непонятно одно: в качестве параметра u[] я должен "занести" весь исходный массив точек?
А что делать, если у меня эти точки добавляются по-очереди по одной штуке в "рантайме" (т.е. мне надо посчитать этот Лапласиан для каждой новой точки)?

ЗЫ: Я с высшей математикой уже давно не дружу и тяжко заново учиться с нуля...   Какая-то жесть...  Грустный
« Последнее редактирование: Апрель 25, 2019, 17:20 от kuzulis » Записан

ArchLinux x86_64 / Win10 64 bit
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2094



Просмотр профиля
« Ответ #1 : Апрель 23, 2019, 15:24 »

Цитировать
Но непонятно одно: в качестве параметра u[] я должен "занести" весь исходный массив точек?
Необязательно. Лапласьян в 1D - это просто вторая производная. В дискретном случае вторая производная в точке i определяется также и значениеми функций в соседних ближайших точках:
f''(i) = (-f(i+dx) + 2*f(i) - f(i-dx))/(dx*dx)

Аналогично и с градиентом (градиент - это вектор)
grad f(i) = (f(i+dx) - f(i-dx))/(2*dx)
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #2 : Апрель 23, 2019, 16:00 »

Оххх.. Спасибо тебе огромное...  Улыбающийся

А минимальный dx для дискретных точек равен 1?
Записан

ArchLinux x86_64 / Win10 64 bit
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2094



Просмотр профиля
« Ответ #3 : Апрель 23, 2019, 17:32 »

Оххх.. Спасибо тебе огромное...  Улыбающийся

А минимальный dx для дискретных точек равен 1?
Да. Это расстояние между двумя ближайшими точками)
« Последнее редактирование: Апрель 23, 2019, 17:33 от m_ax » Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #4 : Апрель 23, 2019, 17:59 »

Цитировать
Лапласьян в 1D - это просто вторая производная.

Что-то не пойму одну вещь: а почему в лапласиане и во второй производной тогда формулы немного разные? Например, знак '-' немного по-другому применяется.

Например, вторая производная считается так: y1'' = (y2 - 2*y1 + y0) / h^2 (взято отсюда и прочих других)

но, лапласиан считается так: y1'' = (-y2 + 2*y1 - y0) / h^2

в чем фишка то, если ты говоришь, что лапласиан - это вторая производная?
Записан

ArchLinux x86_64 / Win10 64 bit
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2094



Просмотр профиля
« Ответ #5 : Апрель 23, 2019, 18:27 »

Цитировать
но, лапласиан считается так: y1'' = (-y2 + 2*y1 - y0) / h^2
Да, ошибка в знаке.

Ниже приатачил вывод:
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #6 : Апрель 23, 2019, 18:51 »

Ахх. спасибо..
« Последнее редактирование: Апрель 25, 2019, 17:21 от kuzulis » Записан

ArchLinux x86_64 / Win10 64 bit
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.083 секунд. Запросов: 22.