Pergunta

Eu tenho um sistema de (primeira ordem) ODEs com bastante caro para calcular derivados.

No entanto, os derivados podem ser computados consideravelmente mais barato para dentro de determinados limites de erro, ou porque os derivativos são calculados a partir de uma série convergente e barrancos pode ser colocado sobre a contribuição máxima de termos deixado cair ou através do uso de informações gama precomputed armazenados em kd-árvore / octree lookup tabelas.

Infelizmente, eu não tenho sido capaz de encontrar qualquer solucionadores de ODE gerais que podem se beneficiar deste; todos eles parecem apenas dar-lhe coordena e quer uma volta resultado exato. (Mente você, eu não sou nenhum especialista em ODEs, eu estou familiarizado com Runge-Kutta, o material no livro numérica Recipies, LSODE e solver da Biblioteca Científica do Gnu)

.

ou seja, para todos os solucionadores que eu vi, você fornece uma função derivs callback aceitar um t e uma série de x, e retornando um array de dx/dt volta; mas o ideal é que estou procurando uma que dá a t callback, xs, e uma série de erros aceitáveis ??, e recebe dx/dt_min e dx/dt_max matrizes para trás, com a gama derivado garantido para estar dentro da precisão exigida. (Provavelmente há inúmeras variações igualmente útil possível).

Os ponteiros para solucionadores que são projetados com esse tipo de coisa em mente, ou abordagens alternativas para o problema (eu não posso acreditar que eu sou a primeira pessoa que quer algo parecido com isso) seria muito apreciada.

Foi útil?

Solução 3

Tendo pensado sobre isso um pouco mais, ocorreu-me que a aritmética intervalo é provavelmente chave. Minha função derivs basicamente retorna intervalos. Um integrador usando aritmética intervalar manteria x é como intervalos. Tudo o que eu estou interessado em se obter um suficientemente pequeno limite de erro nas xs em um t final. Uma abordagem óbvia seria iterativamente re-integrar, melhorar a qualidade da amostra introduzindo o mais erro cada iteração até que, finalmente, obter um resultado com limites aceitáveis ??(embora isso soa como ele poderia ser uma "cura pior que a doença" no que diz respeito a eficiência global). Eu suspeito controle de tamanho do passo adaptativo poderia caber-se muito bem em tal esquema, com tamanho do passo escolhido para manter a erro "implícito" discretização comparável com o "erro explícito" ou seja, a gama de intervalo).

De qualquer forma, pesquisando "ode aritmética solver intervalo" ou apenas "intervalo ode" aparece um monte de coisas novas e relevantes interessante ( vnode e as suas referências em particular).

Outras dicas

A grosso modo, se você sabe f' até eps erro absoluto, e integrar a partir de x0 para x1, o erro da integral proveniente do erro no derivado vai ser <= eps * (x1 - x0). Há também erro de discretização, vindo do seu solucionador ODE. Considere como eps grande *. (X1 - x0) pode ser para você e alimentar o solucionador ODE com valores de f' computadas com o erro <= eps

Eu não estou certo de que este é uma questão bem colocada.

Em muitos algoritmos, por exemplo, não-linear equação resolvendo, f (x) = 0, uma estimativa de um f derivado '(x) é tudo que é necessário para o uso em algo como o método de Newton desde que você só precisa ir na "direção geral" da resposta.

No entanto, neste caso, o derivativo é uma parte principal do (ODE) equação que você está resolvendo - obter o errado derivado, e você só vai ter a resposta errada; é como tentar resolver f (x) = 0 com apenas uma aproximação para f (x).

Como outra resposta sugeriu, se você configurar o ODE como f aplicada (x) + g (x), onde g (x) é um termo de erro, você deve ser capaz de se relacionar erros em seus derivados para erros em seu insumos.

Se você tem um sistema rígido, você estará usando alguma forma de método implícito caso em que os derivativos são usados ??apenas dentro da iteração Newton. Usando um Jacobian aproximada vai custar-lhe a convergência quadrática rigoroso sobre as iterações de Newton, mas que muitas vezes é aceitável. Alternativamente (principalmente se o sistema é grande), você pode usar um Jacobian-livre método de Newton-Krylov para resolver os estágios, caso em que o seu Jacobian aproximada torna-se apenas um pré-condicionador e você reter convergência quadrática na iteração Newton.

Você olhou em usar odeset ? Ele permite que você defina opções para um solucionador ODE, então você passar a estrutura de opções como o quarto argumento para qualquer Solver ligar. As propriedades de controle de erro (RelTol, AbsTol, NormControl) podem ser de maior interesse para você. Não tenho certeza se este é exatamente o tipo de ajuda que você precisa, mas é a melhor sugestão que eu poderia vir acima com, tendo passado usou o ODE MATLAB funções anos.

Além disso:? Para a função derivada definida pelo usuário, você poderia apenas tolerâncias de código duro para o cálculo dos derivados, ou você realmente precisa de limites de erro para ser passado a partir do solver

Não tenho certeza estou contribuindo muito, mas no mundo da moda pharma, usamos LSODE, DVERK e DGPADM. DVERK é uma boa rápido simples ordem 5/6 Runge-Kutta solver. DGPADM é um bom solucionador de matriz de expoente. Se seus ODEs são lineares, expoente matriz é melhor de longe. Mas o problema é um pouco diferente.

BTW, o argumento T é apenas em lá para a generalidade. Eu nunca vi um sistema real que dependia T.

Você pode estar quebrando em um novo território teórico. Boa sorte!

Adicionado:. Se você está fazendo simulações orbitais, parece-me que ouvi falar de métodos especiais utilizados para que, com base nas curvas de seção cônica

Verifique em um método de elementos finitos com funções de base lineares e quadratura ponto médio. Resolvendo a seguinte ODE requer apenas cada um dos f uma avaliação (x), k (x), e b (x) por elemento:

-k (x) u '' (x) + b (x) u '(x) = f (x)

A resposta terá pointwise erro proporcional ao erro em suas avaliações.

Se você precisar de resultados mais suaves, você pode usar funções de base quadrática com 2 avaliação de cada uma das funções acima por elemento.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top