Como você melhora a precisão de um método de diferenças finitas para encontrar o sistema eigens de uma EDO linear singular

11

Estou tentando resolver uma equação do tipo:

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

Onde f(x) possui um pólo simples em 0 , para os menores N autovalores e autovetores. As condições de contorno são: ψ(0)=0 e ψ(R)=0 , e só estou olhando para a função sobre (0,R] .

No entanto, se eu fizer um método de diferença finita muito simples e com espaçamento uniforme, o menor autovalor é muito impreciso (às vezes há um autovalor "falso" com várias ordens de magnitude mais negativas do que a que eu sei que deveria estar lá, o real "primeiro autovalor" se torna o segundo, mas ainda é ruim).

O que afeta a precisão de um esquema de diferenças tão finitas? Suponho que a singularidade esteja causando o problema, e que uma grade desigualmente espaçada melhoraria significativamente as coisas. Existem documentos que possam me apontar para um bom método não uniforme de diferenças finitas? Mas talvez um esquema de diferença de ordem mais alta o melhore ainda mais? Como você decide (ou é apenas "tente os dois e veja")

nota: meu esquema de diferenças finitas é tridiagonal simétrico onde as 3 diagonais são:

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

Δ

Andrew Spott
fonte
1Δ2f(x)

Respostas:

6

Se você deseja aumentar a precisão de um esquema de diferenças finitas, pode sempre tentar aumentar o grau do seu estêncil. Em pontos equidistantes, porém, isso pode levar a instabilidades numéricas. Para evitar esses problemas e ainda obter alta precisão, sugiro o uso de métodos espectrais .

Se o seu problema tiver pólos fixos, tente contorná-los dividindo seu domínio e resolvendo dois problemas associados.

chebguif(x)

chebguiu(x)u(x)x=λu[1,1]

Usando <code> chebgui </code> para calcular os valores próprios e modos próprios de uma equação diferencial de segunda ordem simples.

Atualizar

Se você quiser resolver esse problema sem se envolver muito com a Chebfun, todos os detalhes devem estar no capítulo 9 do livro de Nick Trefethen, " Spectral Methods in Matlab ".

Pedro
fonte
Editei meu post original para deixar claro que não estou realmente olhando para o bastão, apenas muito perto dele. Obrigado pela informação, vou ter que verificar chebfun.
Andrew Spott
3
Votado sem comentar? Por favor, para o benefício de todos, você poderia apontar como essa resposta poderia ser melhorada?
Pedro
0

Uma maneira de melhorar rapidamente as coisas (embora provavelmente não seja muito melhor) é considerar a semelhança entre os métodos de diferença finita de ordem mais baixa que você usa e o método de elemento finito de ordem mais baixa. Se você calcular a matriz tri-diagonal obtida usando as funções de forma de elementos finitos lineares em 1d, a discretização das segundas derivadas será exatamente a mesma (até um fator mas você obterá um termo diferente para o que sai de . Eu não sei como parece no seu caso, mas onde agora você usa , será algo como ondef ( x ) ψ ( x ) f ( x ) f ( x i ) x i + 1 x i - 1 f ( x ) φ i ( x ) φ i ( x ) x i f ( x )Δxf(x)ψ(x)f(x)f(xi)xi1xi+1f(x)φi(x)φi(x)é a função de chapéu que atinge o pico em . Se for suficientemente simples, você poderá calcular exatamente essa integral e ela fornecerá uma matriz mais precisa da qual você precisará encontrar o valor próprio.xif(x)

Obviamente, se você já possui elementos finitos, também pode investir no uso de elementos de ordem superior, que não são muito mais difíceis em 1d.

Wolfgang Bangerth
fonte