Python & EDP

Réponses à toutes vos questions après le Bac (Fac, Prépa, etc.)
Kingudamu
Membre Naturel
Messages: 16
Enregistré le: 12 Nov 2018, 14:49

Python & EDP

par Kingudamu » 19 Mar 2020, 20:43

Bonjour je cherche à valider le problème de Dirichlet 2D (Homogène) suivant:

Code: Tout sélectionner
# taille du domaine [0,L]x[0,H]
L=2.;
H=3.;
#nombre de points de discretisation et pas de maillage
N=100;
M=180;
#
l=L/(N+1);
h=H/(M+1);
# vecteur discretisation selon x
x=linspace(l,L-l,N)
# vecteur discretisation selon y
y=linspace(h,H-h,M)
#construction de la matrice A par ses diagonales
#
D0=(2/(l**2)+2/(h**2))*ones(N*M)# diagonale principale
D1=-1/l**2*ones(N*M)# surdiagonale
D1[N::N]=0.#correction de la surdiagonale (voisin de droite n existe pas au bord droit)
DM1=-1/l**2*ones(N*M)# sousdiagonale
DM1[N-1::N]=0.#correction de la sousdiagonale (voisin de gauche n existe pas au bord gauche)
DN=-1/h**2*ones(N*M)
A=spdiags(D0,[0],N*M,N*M)+spdiags(D1,[1],N*M,N*M)+spdiags(DM1,[-1],N*M,N*M)
A=A+spdiags(DN,[N],N*M,N*M)+spdiags(DN,[-N],N*M,N*M)# A est pentadiagonale
#construction d'un second membre trivial
f=ones(N*M)
#
#resolution du systeme lineaire creux
#
t=clock()
u=spsolve(A,f)
t2=clock()
print('resolution systeme done in %5.4f s' % (t2 - t))
#uu=matrix(u,N,M)# permet de reconstruire uu comme un tableau a 2 indices,
                #uu(i,j)=u(k), avec k la numerotation de TD
# representation graphique de la solution
uu=reshape(u,(M,N))
uubord=0*ones((M+2,N+2));
uubord[1:M+1,1:N+1]=uu;
#print(A.toarray())
from mpl_toolkits import mplot3d
ax = plt.axes(projection='3d')
X, Y = meshgrid(linspace(0,L,N+2),linspace(0,H,M+2))
ax = plt.axes(projection='3d')
#ax.contour3D(X, Y, uubord, 50, cmap='binary')
ax.plot_surface(X, Y, uubord, rstride=1, cstride=1,
                cmap='viridis', edgecolor='none');
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('u');


J'ai fais:

Code: Tout sélectionner
import numpy as np
import matplotlib.pyplot as plt
import pylab
import scipy as sp
from time import clock
from scipy import sparse
from scipy.sparse.linalg import spsolve
from scipy.sparse import spdiags

u=lambda x, y : cos(x) + sin(y)
f=lambda x, y : -cos(x) - sin(y)
L=2.;
H=3.;
N=20;
M=15;
def erreur_Dirchlet2(N, M, u, f, p):
     l=L/(N+1);
    h=H/(M+1);
    x=linspace(l,L-l,N)
    y=linspace(h,H-h,M)
    xx = []
    yy = y*ones((1,M))
    a = ones((N,1))
    for i in range(len(a)):
        xx.append([x[i]*a[i][0]])
    ff = f(xx,yy)
    F = ff.reshape(N*M)

    D0=(2/(l**2)+2/(h**2))*ones(N*M)
    D1=-1/l**2*ones(N*M)
    D1[N::N]=0.
    DM1=-1/l**2*ones(N*M)
    DM1[N-1::N]=0.
    DN=-1/h**2*ones(N*M)
    A=spdiags(D0,[0],N*M,N*M)+spdiags(D1,[1],N*M,N*M)+spdiags(DM1,[-1],N*M,N*M)
    A=A+spdiags(DN,[N],N*M,N*M)+spdiags(DN,[-N],N*M,N*M)

    U=spsolve(A,F)
    err=abs(U-u(xx,yy))
    normerr=sum([ei**p for ei in err])
    normerr=normerr**(1/p)
    normeU=sum([abs(ui)**p for ui in U])
    normeU=normeU**(1/p)
    return normerr/normeU


J'avance pas du tout, si quelqu'un peut aider, je remercie d'avance.



Avatar de l’utilisateur
fatal_error
Modérateur
Messages: 6610
Enregistré le: 22 Nov 2007, 12:00

Re: Python & EDP

par fatal_error » 20 Mar 2020, 07:07

hi

vu que tu as déjà tout écrit je présume que tu as l'algorithme
et je présume de fait que tu as une erreur d'implémentation?

prends un jeu de données simplifié et regardes le résultat que t'obtiens avec celui que tu aimerais avoir
debug ton code jusqu'à ce que tu trouves l'erreur
puis si tu trouves pas poste ton jeu de données ici en >>> expliquant tes démarches effectuées <<<?
la vie est une fête :)

 

Retourner vers ✯✎ Supérieur

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 18 invités

cron

Tu pars déja ?



Fais toi aider gratuitement sur Maths-forum !

Créé un compte en 1 minute et pose ta question dans le forum ;-)
Inscription gratuite

Identification

Pas encore inscrit ?

Ou identifiez-vous :

Inscription gratuite