\n",
"\n",
"La méthode de Newton permet de trouver numériquement la solution de l'équation $f(x)=0$ en partant d'un point de départ $x_0$ et en itérant la suite:\n",
"\n",
"$$\n",
"x_{n+1}=x_n-\\dfrac{f(x_n)}{f'(x_n)}\n",
"$$\n",
"\n",
"jusqu'à atteindre un critère de convergence.\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Ecrire une fonction permettant de calculer la solution de $f(x)=0$ en connaissant sa dérivée que l'on notera $df$ ainsi que le point de départ que l'on notera $x_0$:"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"def newton(f,df,x0):\n",
" norm=1.\n",
" n=0\n",
" while abs(norm) > 1e-7:\n",
" n+=1\n",
" ...\n",
" x0=...\n",
" print(n,norm)\n",
" return x0"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"On souhaite utiliser cette méthode pour calculer la solution de l'équation $x^2-a=0$\n",
"Quels doivent être les fonctions $f(x)$ et $f'(x)$ pour que la méthode de Newton donne la solution de cette équation."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"def f(x,a=2):\n",
" return ???\n",
"\n",
"def df(x,a=2):\n",
" return ???"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**Donner une valeur approchée des nombres suivant:**\n",
"\n",
"* $\\sqrt{2}$\n",
"* $\\sqrt{3}$\n",
"* $\\sqrt{5}$\n",
"* $\\sqrt{7}$"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"newton(f,df,?)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"np.sqrt(2)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Comarer la convergence de la méthode en fonction de la valeur de $a$"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Commentaires"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# 2 - Méthode de Newton vectorielle\n",
"\n",
"La méthode de Newton permet de trouver numériquement la solution de l'équation $F(x,y)=0$ en partant d'un point de départ $X_0=(x_0,y_0)$ et en itérant la suite:\n",
"\n",
"$$\n",
"\\mathbf{J(X_n)}d\\mathbf{X_{n+1}}=-\\mathbf{F(X_n)}\n",
"$$\n",
"\n",
"avec:\n",
"\n",
"$$\n",
"d\\mathbf{X_{n+1}}=\\mathbf{X_{n+1}-X_n}\n",
"$$\n",
"\n",
"jusqu'à atteindre un critère de convergence.\n",
"\n",
"
1 - Système non linéaire
\n",
"\n",
"Considérons le système suivant:\n",
"\n",
"$$\n",
"\\left\\{\\begin{array}{lcr}\n",
"9x^2+36y^2+4z^2&=&36\\\\\n",
"x^2-2y^2-20z&=&0\\\\\n",
"x^2-y^2+z^2&=&0\n",
"\\end{array}\\right.\n",
"$$\n",
"\n",
"Quelle est la Jacobienne du système ?"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"$$\n",
"J=\\left[\\begin{array}{lcr}\n",
"? & ? & ?\\\\\n",
"? & ? & ? \\\\\n",
"? & ? & ?\n",
"\\end{array}\\right]\n",
"$$"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"def F(W):\n",
" F1=...\n",
" F2=...\n",
" F3=...\n",
" return np.array([F1,F2,F3])\n",
"\n",
"\n",
"def J(W):\n",
" J=np.array([[?,?,?],[?,?,?],[?,?,?]])\n",
" return J\n",
" \n",
" \n",
"def NEWTON(F,dF,W0):\n",
" norm=10.\n",
" n=0\n",
" while (...):\n",
" n+=1\n",
" dX=...\n",
" W0=W0+dX\n",
" norm=...\n",
" print(n,norm)\n",
" return W0"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"En partant du triplet $(1,1,1)$ donner une valeur approchée de la solution."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"W0=...\n",
"W=NEWTON(F,J,W0)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"print(W)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"En évaluant la fonction sur le point $W$ trouvé, assurez-vous que cette valeur (appellé résidu) est très proche de 0."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"F(W)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Commentaires...."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 3 - EDP non linéaire \n",
"\n",
"Considérons maintenant le système d'EDP non linéaire suivante:\n",
"\n",
"$$\n",
"u\\dfrac{\\partial u}{\\partial x}=\\nu\\dfrac{\\partial^2 u}{\\partial x^2}\n",
"$$\n",
"\n",
"\n",
"Avec les conditions $u(0)=0$ et $u(N)=1$\n",
"\n",
"Ecrire cette EDP sous forme conservative\n",
"\n",
"L'EDP s'écrit sous forme conservative:\n",
"$$\n",
"\\dfrac{1}{2}\\dfrac{\\partial u^2}{\\partial x}=\\nu\\dfrac{\\partial^2 u}{\\partial x^2}\n",
"$$\n",
"\n",
"Ecrire l'équation sous forme discrète en utilisant des schémas centrés d'ordre 2\n",
"\n",
"\n",
"L'utilisation des schémas centré d'ordre 2 donne:\n",
"\n",
"$$\n",
"\\dfrac{1}{2}\\dfrac{u_{i+1}^2-u_{i-1}^2}{2\\Delta x}=\\nu\\dfrac{u_{i-1}-2u_i+u_{i+1}}{\\Delta x^2}\n",
"$$\n",
"\n",
"\n",
"\n",
"\n",
"Ou souhaite utiliser la méthode de Newton pour résoudre cette EDP non linéaire.\n",
"\n",
"On a ici $F(u)=\\dfrac{1}{2}\\dfrac{\\partial u^2}{\\partial x}-\\nu\\dfrac{\\partial^2 u}{\\partial x^2}$\n",
"\n",
"avec:\n",
"\n",
"$\\dfrac{d F}{d u}=u\\dfrac{\\partial .}{\\partial x}-\\nu\\dfrac{\\partial^2 .}{\\partial x^2}$\n",
"\n",
"\n",
"Compléter la cellule suivante pour pouvoir utiliser la méthode de Newton"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"def F(W,dx,nu):\n",
" nx=W.shape[0]\n",
" ff=np.zeros(nx)\n",
" ff[1:-1]=...\n",
" return ff\n",
" \n",
"def J(W,dx,nu):\n",
" nx=W.shape[0]\n",
" J1=...\n",
" J2=...\n",
" J0=J1/dx-nu*J2/dx**2\n",
" return J0\n",
" \n",
" \n",
"def NEWTON(F,dF,W0,dx=1.,nu=0.1,nmax=10000):\n",
" norm=10.\n",
" n=0\n",
" while (norm>1e-12 and nCalculer la solution de l'EDP ci-dessus en utilisant la méthode de Newton.\n",
"\n",
"On choisit donc un domaine de simulation sur lequel on recherche la solution de l'EDP précédente. On se donne un nombre de points, et un $\\Delta x$. On fixe ensuite le coefficient $\\nu$.\n",
"\n",
"La quantité $\\dfrac{U_0\\Delta x}{\\nu}$ est alors importante. Elle doit rester la plus faible possible. Cette quantité correspond au nombre de Reynolds basé sur l'echelle de la taille de maille. on parle de Reynolds de maille, on le note $R_{em}$. Ici on initialisera avec une fonction linéaire:"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"nx=100\n",
"dx=0.1\n",
"x=np.linspace(0,1,nx)\n",
"u0,un=0,1\n",
"W0=np.linspace(u0,un,nx)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"nu1,nu2,nu3=2,1,0.1\n",
"W1=NEWTON(F,J,W0,dx,nu=nu1);print('Rem='+str(un*dx/nu1))\n",
"W2=NEWTON(F,J,W0,dx,nu=nu2);print('Rem='+str(un*dx/nu2))\n",
"W3=NEWTON(F,J,W0,dx,nu=nu3);print('Rem='+str(un*dx/nu3))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Tracer le résidu F(W) (il doit être le plus uniformément nul)."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"plt.plot(F(W1,dx,nu1))\n",
"plt.plot(F(W2,dx,nu2))\n",
"plt.plot(F(W3,dx,nu3))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Représenter la solution trouvée u(x)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"fig=plt.figure(figsize=(16,6))\n",
"plt.plot(x,W1,label='$\\\\nu='+str(nu1)+'$')\n",
"plt.plot(x,W2,label='$\\\\nu='+str(nu2)+'$')\n",
"plt.plot(x,W3,label='$\\\\nu='+str(nu3)+'$')\n",
"plt.grid(True);plt.legend()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Commentaires..."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Conclusion\n",
"\n",
"Présentez une synthèse de vos résultats et des étapes de calcul de votre TP.\n"
]
},
{
"cell_type": "code",
"execution_count": 79,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n"
],
"text/plain": [
""
]
},
"execution_count": 79,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from IPython.core.display import HTML\n",
"style=open('notebooks.css', \"r\").read()\n",
"HTML(style)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"\n",
"