J'essaie de trouver des ressources pour aider à expliquer comment choisir les conditions aux limites lors de l'utilisation de méthodes aux différences finies pour résoudre les PDE.
Les livres et notes auxquels j'ai actuellement accès disent tous des choses similaires:
Les règles générales régissant la stabilité en présence de frontières sont beaucoup trop compliquées pour un texte introductif; ils nécessitent des machines mathématiques sophistiquées
(A. Iserles Un premier cours dans l'analyse numérique des équations différentielles)
Par exemple, lorsque vous essayez d'implémenter la méthode saute-mouton en 2 étapes pour l'équation d'advection:
en utilisant MATLAB
M = 100; N = 100;
mu = 0.5;
c = [mu 0 -mu];
f = @(x)(exp(-100*(x-0.5).^2));
u = zeros (M, N);
x = 1/(M+1) * (1:M);
u(:,1) = f(x);
u(:,2) = f(x + mu/(M+1));
for i = 3:N
hold off;
u(:,i) = conv(u(:,i-1),c,'same') + u(:,i-2);
plot(x, u(:,i));
axis( [ 0 1 0 2] )
drawnow;
end
La solution se comporte bien jusqu'à ce qu'elle atteigne la limite, lorsqu'elle commence très soudainement à se comporter mal.
Où puis-je apprendre à gérer des conditions aux limites comme celle-ci?
la source
Réponse générale
Votre problème est que vous ne définissez pas (ou même ne spécifiez pas) les conditions aux limites - votre problème numérique est mal défini.
En règle générale, il existe deux manières possibles de spécifier les conditions aux limites:
La voie à suivre dépend fortement de la physique de votre problème. Pour les problèmes de type équation d'onde, on détermine généralement les valeurs propres du flux jacobien afin de décider si des conditions aux limites externes sont nécessaires ou si la solution intérieure doit être utilisée (cette méthode est communément appelée `` remontée '').
Vous pouvez trouver une version modifiée de votre code source ci-dessous:
la source
N = 1000
et exécutez le code un peu plus longtemps, vous constatez qu'il ne se comporte pas tout à fait comme prévu.J'ai donc examiné cela plus en détail et il semble que cela (au moins dans les cas de base que je gère) dépend de la vitesse de groupe de la méthode.
La méthode leapfrog (par exemple) est:
Maintenant, nous devons trouver la vitesse de groupe des conditions aux limites:
Nous pouvons calculer la vitesse du groupe limite comme suit:
donc pour trouver des vitesses de groupe que les limites permettent, nous devons trouver:
J'ai encore pas mal de choses à lire à ce sujet avant de le comprendre complètement. Je pense que les mots clés que je recherche sont la théorie GKS.
Source pour toutes ces notes A Iserles Part III
Un calcul plus clair de ce que j'ai fait peut être trouvé ici: http://people.maths.ox.ac.uk/trefethen/publication/PDF/1983_7.pdf
la source
Les gars, je suis très nouveau sur ce site. Peut-être que ce n'est pas l'endroit pour demander, mais s'il vous plaît pardonnez-moi car je suis très nouveau ici :) J'ai un problème extrêmement similaire, la seule différence étant la fonction de démarrage qui, dans mon cas, est une onde cosinusoïdale. Mon code est le suivant: effacer tout; clc; ferme tout;
M = 1000; N = 2100;
mu = 0,5;
c = [mu 0 -mu]; f = @ (x) 1- cos (20 * pi * x-0,025). ^ 2; u = zéros (M, N); x = 0: (1 / M): 0,05; u (1: longueur (x), 1) = f (x); u (1: longueur (x), 2) = f (x - mu / (M)); x = espace lins (0,1, M);
pour i = 3: N retient;
graphique (x, u (:, i)); axe ([0 1,5 -0,5 2]) tracé; % pause fin
Il y a déjà ce code ici, mais pour une raison quelconque, probablement liée à la vague cosinus, mon code échoue: / toute aide serait appréciée :) merci!
la source