Baixe o app para aproveitar ainda mais
Prévia do material em texto
dy dx = f (x, y); y(x0) = y0 = c y(xn) = yn = ? em que x0 = a xn = b Método Euler (Simples) Input f(x_,y_); h; c; a; b; Corpo n=IntegerPart[(b-a)/h]; x=ConstantArray[0,n]; x[[0]]=a; y=ConstantArray[0,n]; y[[0]]=c; For[i=0,i<=n,i++, { y[[i+1]]=y[[i]]+h*f(x[[i]],y[[i]]); x[[i+1]]=x[[i]]+h; }] Output y[[n]] Método Euler Modificado Input f(x_,y_); f(x_,z_); h; c; a; b; Corpo n=IntegerPart[(b-a)/h]; x=ConstantArray[0,n]; x[[0]]=a; y=ConstantArray[0,n]; y[[0]]=c; z=ConstantArray[0,n]; z[[0]]=c; For[i=0,i<=n,i++, For[i=0,i<=n,i++, { x[[i+1]]=x[[i]]+h; z[[i+1]]=z[[i]]+h*f(x[[i]],z[[i]]); y[[i+1]]=y[[i]]+(h/2) f(x[[i+1]],z[[i+1]]) }] Output y[[n]] Comparar cada algoritmo em relação a solução analítica Usando Método Euler Simples In[22]:= f[x_, y_] := -y + x + 2; h = 0.1; c = 2; a = 0; b = 0.5; n = parte inteira IntegerPart[(b - a)/h]; x = arranjo constante ConstantArray[0, n]; x〚0〛 = a; y = arranjo constante ConstantArray[0, n]; y〚0〛 = c; para cada For[i= 0, i< n, i++, { y〚i+ 1〛 = y〚i〛 + h*f[x〚i〛, y〚i〛]; x〚i+ 1〛 = x〚i〛 + h }] y (*Solução Euler*) Out[33]= 2[2., 2.01, 2.029, 2.0561, 2.09049] w = x; fa[w_] := 1 + w + exponencial Exp[-w]; (*Solução Analítica*) 2 Exercício Nivelamento.nb In[45]:= tabela Table[{w〚i〛, fa[w〚i〛]}, {i, 0, n}] Out[45]= {{0, 2}, {0.1, 2.00484}, {0.2, 2.01873}, {0.3, 2.04082}, {0.4, 2.07032}, {0.5, 2.10653}} In[46]:= gráfico de linha d⋯ ListLinePlot[{ tabela Table[{x〚i〛, y〚i〛}, {i, 0, n}], tabela Table[{w〚i〛, fa[w〚i〛]}, {i, 0, n}]}] 0.1 0.2 0.3 0.4 0.5 2.02 2.04 2.06 2.08 2.10 Sendo a linha laranja a solução analitica e a azul a soluçao pelo método. In[334]:= apaga tudo ClearAll[x, y, a, b, c, h, n, w]; Método Euler Modificado In [ ] := f1[x_, z_] := -z + x + 2; h = 0.1; c = 2; a = 0; b = 0.5; n = parte inteira IntegerPart[(b - a)/h]; x = arranjo constante ConstantArray[0, n]; x〚0〛 = a; y = arranjo constante ConstantArray[0, n]; y〚0〛 = c; z = arranjo constante ConstantArray[0, n]; z〚0〛 = c; para cada For[i= 0, i< n, i++, { x〚i+ 1〛 = x〚i〛 + h ; z〚i+ 1〛 = z〚i〛 + h*f1[x〚i〛, z〚i〛]; y〚i+ 1〛 = y〚i〛 + (h/2)*(f1[x〚i〛, z〚i〛] + f1[x〚i+ 1〛, z〚i+ 1〛])}] In [ ] := f2[x_, y_] := -y + x + 2; Exercício Nivelamento.nb 3 y (*Solução Método Euler Modificado*) Out[ ]= 2[2.005, 2.0195, 2.04255, 2.0733, 2.11097] z (*Solução Método Euler Simples*) Out[ ]= 2[2., 2.01, 2.029, 2.0561, 2.09049] In [ ] := gráfico de linha d⋯ ListLinePlot[{ tabela Table[{x〚i〛, y〚i〛}, {i, 0, n}], tabela Table[{w〚i〛, fa[w〚i〛]}, {i, 0, n}]}] 0.1 0.2 0.3 0.4 0.5 2.02 2.04 2.06 2.08 2.10 Sendo a linha laranja a solução analítica e a azul pelo método modificado. Possivel observar que esse método é mais preciso do que o método de euler simples. In [ ] := apaga tudo ClearAll[x, y, a, b, c, h, n, z]; Comparar em relação a variação de passo Usando Método Euler Simples Passo1 0.01 Passo2 0.05 Passo3 0.1 Passo4 0.15 Passo5 0.2 Erro global step (*Lista de soluçoes para euler simples variando o passo para x=0.5*) Out[392]= {2.10501, 2.09874, 2.09049, 2.06412, 2.04} 4 Exercício Nivelamento.nb fb = 1 + 0.5 + exponencial Exp[0.5]; (*Solução analitica em x=0.5)*) w = arranjo constante ConstantArray[fb, 5]; error = valor absoluto Abs[(fb - step)]/fb; (*Erro euler simples*) In[384]:= h = {0.01, 0.05, 0.1, 0.15, 0.2}; gráfico de linha⋯ ListLinePlot[ tabela Table[{h〚i〛, error〚i〛}, {i, 0, 5}]] 0.05 0.10 0.15 0.20 0.335 0.340 0.345 0.350 Portanto o erro aumenta com o aumento de passos. apaga tudo ClearAll[w, h]; Método Euler Modificado Passo1 0.01 Passo2 0.05 Passo3 0.1 Passo4 0.15 Passo5 0.2 Erro Global stepm(*Lista de soluçoes para euler modificado variando o passo para x=0.5*) Out[509]= {2.10698, 2.10877, 2.11097, 2.09307, 2.076} w = arranjo constante ConstantArray[fb, 5]; errorm= valor absoluto Abs[(fb - stepm)]/fb; (*Erro Euler modificado*) h = {0.01, 0.05, 0.1, 0.15, 0.2}; gráfico de linha⋯ ListLinePlot[ tabela Table[{h〚i〛, errorm〚i〛}, {i, 0, 5}]] Exercício Nivelamento.nb 5 0.05 0.10 0.15 0.20 0.330 0.332 0.334 0.336 0.338 0.340 Tambem aumenta com o aumento do passo, porém menos do que o euler simples para o mesmo intervalo. In[514]:= apaga tudo ClearAll[w, h]; Método Euler In[604]:= f[x_, y_] := -x^2*y^2 + y; h = 0.5; c = 1; a = 0; b = 4; n = parte inteira IntegerPart[(b - a)/h]; x = arranjo constante ConstantArray[0, n]; x〚0〛 = a; y = arranjo constante ConstantArray[0, n]; y〚0〛 = c; para cada For[i= 0, i< n, i++, { y〚i+ 1〛 = y〚i〛 + h*f[x〚i〛, y〚i〛]; x〚i+ 1〛 = x〚i〛 + h }]; y〚n〛 Out[615]= 0.0918055 In[603]:= apaga tudo ClearAll[x, y, a, b, c, h, n, w, f]; 6 Exercício Nivelamento.nb Método Euler Modificado In[616]:= f1[x_, z_] := -x^2*z^2 + z; h = 0.5; c = 1; a = 0; b = 4; n = parte inteira IntegerPart[(b - a)/h]; x = arranjo constante ConstantArray[0, n]; x〚0〛 = a; y = arranjo constante ConstantArray[0, n]; y〚0〛 = c; z = arranjo constante ConstantArray[0, n]; z〚0〛 = c; para cada For[i= 0, i< n, i++, { x〚i+ 1〛 = x〚i〛 + h ; z〚i+ 1〛 = z〚i〛 + h*f1[x〚i〛, z〚i〛]; y〚i+ 1〛 = y〚i〛 + (h/2)*(f1[x〚i〛, z〚i〛] + f1[x〚i+ 1〛, z〚i+ 1〛])}]; y〚n〛 Out[629]= -0.168956 In[630]:= apaga tudo ClearAll[x, y, a, b, c, h, n, z, f1]; Exercício Nivelamento.nb 7 Método Euler Simples In[631]:= f[x_, y_] := -x*y^3 - y; h = 0.5; c = 1; a = 0; b = 2; n = parte inteira IntegerPart[(b - a)/h]; x = arranjo constante ConstantArray[0, n]; x〚0〛 = a; y = arranjo constante ConstantArray[0, n]; y〚0〛 = c; para cada For[i= 0, i< n, i++, { y〚i+ 1〛 = y〚i〛 + h*f[x〚i〛, y〚i〛]; x〚i+ 1〛 = x〚i〛 + h }]; y〚n〛 Out[642]= 0.0512235 In[643]:= apaga tudo ClearAll[x, y, a, b, c, h, n, w, f]; 8 Exercício Nivelamento.nb Método Euler Modificado In[644]:= f1[x_, z_] := -x*z^3 - z; h = 0.5; c = 1; a = 0; b = 2; n = parte inteira IntegerPart[(b - a)/h]; x = arranjo constante ConstantArray[0, n]; x〚0〛 = a; y = arranjo constante ConstantArray[0, n]; y〚0〛 = c; z = arranjo constante ConstantArray[0, n]; z〚0〛 = c; para cada For[i= 0, i< n, i++, { x〚i+ 1〛 = x〚i〛 + h ; z〚i+ 1〛 = z〚i〛 + h*f1[x〚i〛, z〚i〛]; y〚i+ 1〛 = y〚i〛 + (h/2)*(f1[x〚i〛, z〚i〛] + f1[x〚i+ 1〛, z〚i+ 1〛])}]; y〚n〛 Out[657]= 0.28835 In[658]:= apaga tudo ClearAll[x, y, a, b, c, h, n, z, f1]; Exercício Nivelamento.nb 9
Compartilhar