Métodos numéricos

Exit

Funções auxiliares

Fornece uma tabela com os valores de x numa oluna e os valores de x numa outra coluna

combPair[x_,y_]:={x,y}
combList[x_List,y_List]:=MapThread[combPair,{x,y}]

Solução Exata

Fornece a solução exata para cada função f, com w(0)=x0

solexata[f_,x0_,w0_]:=DSolve[{w'[x]==f[x,w[x]],w[a]==w0},w,x]
z[u_]=(w[u]/.solexata[f,x0,w0])[[1]]

Método de Euler Explícito

Calcula o método de Euler, plota os pontos e o erro a cada iteração

EulerEx[f_,{a_,b_},h_,y0_]:=Module[{x,y,n,erro},
n=(b-a)/h;
erro=Table[0,{i,1,n+1}];

x=Table[a+(i-1)h,{i,1,n+1}];
y=Table[0,{i,1,n+1}];

For[y[[1]]=y0;i=1,i≤n,i++,
y[[i+1]]=y[[i]]+h*f[x[[i]],y[[i]]];
erro[[i+1]]=Abs[y[[i+1]]-z2[x[[i+1]]]]];Print[combList[x,erro]];Print[Norm[erro]];ListPlot[combList[x,y], PlotRange->All]]

Método de Euler de dois passos

Calcula o método de Euler  aperfeiçoado, plota os pontos e o erro a cada iteração

Euler2p[f_,{a_,b_},h_,y0_]:=Module[{x,y,n,yaux},n=(b-a)/h;x=Table[a+(i-1)h,{i,1,n+1}];
y=Table[0,{i,1,n+1}];For[y[[1]]=y0;i=1,i≤n,i++,yaux=y[[i]]+h f[x[[i]],y[[i]]];y[[i+1]]=y[[i]]+h(((f[x[[i]],y[[i]]])+f[x[[i+1]],yaux])/2)];ListPlot[combList[x,y], PlotRange->All,PlotStyle->Green]]

Método de Runge-Kutta de ordem 4

RungeKutta4[f_,{a_,b_},h_,y0_]:=Module[{x,y,n,erro,k1,k2,k3,k4},
n=(b-a)/h;
erro=Table[0,{i,1,n+1}];

x=Table[a+(i-1)h,{i,1,n+1}];
y=Table[0,{i,1,n+1}];

For[y[[1]]=y0;i=1,i≤n,i++,
k1=h f[x[[i]],y[[i]]];
k2=h f[x[[i]]+h/2,y[[i]]+k1/2];
k3=h f[x[[i]]+h/2,y[[i]]+k2/2];
k4=h f[x[[i]]+h,y[[i]]+k3];
y[[i+1]]=y[[i]]+(k1+2k2+2k3+k4)/6;
erro[[i+1]]=Abs[y[[i+1]]-z[x[[i+1]]]]];Print[combList[x,erro]];Print[Norm[erro]];ListPlot[combList[x,y], PlotRange->All]]