Как повысить точность метода конечных разностей для нахождения собственной системы сингулярного линейного ОДУ

11

Я пытаюсь решить уравнение типа:

(2x2f(x))ψ(x)=λψ(x)

Где имеет простой полюс в для наименьших собственных значений и собственных векторов. Граничные условия: и , и я только смотрю на функцию над .f(x)0Nψ(0)=0ψ(R)=0(0,R]

Однако, если я сделаю очень простой, равномерно распределенный метод конечных разностей, наименьшее собственное значение будет очень неточным (иногда встречается «ложное» собственное значение, которое на несколько порядков более отрицательное, чем то, которое, как я знаю, должно быть), реальное «первое собственное значение» становится вторым, но все еще бедно).

Что влияет на точность такой конечно-разностной схемы? Я предполагаю, что именно сингулярность является причиной проблемы, и что неравномерно распределенная сетка могла бы значительно улучшить ситуацию, есть ли какие-либо статьи, которые могут указать мне на хороший неоднородный метод конечных разностей? Но, возможно, схема разности более высокого порядка улучшит это больше? Как вы решаете (или это просто "попробуй и посмотри")

примечание: моя схема конечных разностей является симметричной трехугольной, где 3 диагонали:

(12Δ2,1Δ2f(x),12Δ2)

Где - интервал сетки. И я решаю матрицу, используя прямой симметричный решатель (я предполагаю, что решатель не сильно влияет на точность, я ошибаюсь?)Δ

Эндрю Спотт
источник
Не должен ли средний член вашего конечного другого трафарета быть вместо этого? 1Δ2f(x)
Вольфганг Бангерт

Ответы:

6

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

Если ваша проблема имеет фиксированные полюса, вы можете попытаться обойти их, разделив свой домен и решив две связанные проблемы.

Система Chebfun (отказ от ответственности: одним из разработчиков которой я являюсь) использует вышеупомянутые методы, и вы могли бы быстро развернуть свою проблему в chebguiинтерфейсе. Я бы попробовал сам, но я не знаю, какой у вас домен или .f(x)

Я прикрепил скриншот chebguiокна для вычисления первых шести собственных значений и собственных мод на .u(x)u(x)x=λu[1,1]

Использование <code> chebgui </ code> для вычисления собственных значений и собственных мод простого дифференциального уравнения второго порядка.

Обновить

Если вы хотите решить эту проблему, не вдаваясь в подробности об Chebfun, все детали должны быть в главе 9 книги Ника Трефетена « Спектральные методы в Matlab ».

Pedro
источник
Я отредактировал свой исходный пост, чтобы было ясно, что я не смотрю на полюс, просто очень близко к нему. Спасибо за информацию, я должен проверить chebfun.
Эндрю Спотт
3
Отклонено без комментариев? Пожалуйста, не могли бы вы указать, как можно улучшить этот ответ?
Педро
0

Один из способов быстро улучшить ситуацию (хотя, вероятно, не намного лучше) - рассмотреть сходство используемых вами методов конечных разностей самого низкого порядка и метода конечных элементов самого низкого порядка. Если вы вычисляете трехдиагональную матрицу, полученную при использовании линейных функций формы конечных элементов в 1d, то дискретизация вторых производных будет выглядеть точно так же (до фактора но вы получите другой термин для того, что происходит от . Я не знаю, как выглядит в вашем случае, но где сейчас вы используете , вместо этого это будет что-то вроде гдеΔxf(x)ψ(x)f(x)f(xi)xi1xi+1f(x)φi(x)φi(x)это функция шляпы, которая достигает максимума в . Если достаточно прост, то вы можете точно вычислить этот интеграл, и он предоставит более точную матрицу, из которой вы должны найти собственное значение.xif(x)

Конечно, если вы уже используете конечные элементы, вы также можете инвестировать в использование элементов более высокого порядка, которые не намного сложнее в 1d.

Вольфганг Бангерт
источник