Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- --------- Solucion general de EDO ------------------
- a)
- x = var('x')
- y = function('y',x)
- ed = diff(y,x) == x + 3*y /(x+4)
- sol_gen = desolve(ed,[y,x])
- show(sol_gen) // mostrar bonito
- ---------- Solucion exacta del PVI -----------------
- b)
- sol_ex = desolve(ed,[y,x], ics=[1,1/2])
- show(sol_ex)
- ---------- Valor exacto y(2) para 10 decimales -----
- c)
- sol_ex(2).n(digits=11)
- ---------- Euler -----------------------------------
- d)
- def Euler(f, a, b, N, y0):
- h =(b-a)/N #paso
- nodos = [a] #Inicializamos una lista nodos con el n primer nodo
- aprox = [y0] #Inicializamos una lista aprox con la n condicióninicial
- for k in range(N):
- nodos.append(nodos[k]+h) # Siguiente nodo
- aprox.append(aprox[k]+h*f(nodos[k], aprox[k])) # Siguiente aproximacion
- return matrix(zip(nodos, aprox)) # Devolvemos en forma matricial cada nodo con su aproximación
- def error(sol, metodo_numerico):
- filas = metodo_numerico.dimensions()[0]
- nodos = [n(metodo_numerico[0][0])]
- aprox = [n(metodo_numerico[0][1])]
- exact = [n(sol(metodo_numerico[0][0]))]
- error = [0]
- for k in range(filas-1):
- nodos.append(n(metodo_numerico[k+1][0]))
- aprox.append(n(metodo_numerico[k+1][1]))
- exact.append(n(sol(metodo_numerico[k+1][0])))
- error.append(n(abs(sol(metodo_numerico[k+1][0])-metodo_numerico[k+1][1])))
- print('Error global = %r' % n(max(error)))
- return matrix(zip(nodos, aprox, exact, error))
- N = var('N')
- N = (3-1)/0.02
- f(x, y) = x+3*y/(x+4)
- euler1 = Euler(f, 1, 3, N, 1/2).n(digits=11)
- show(euler1)
- errorEuler1 = error(sol_ex, euler1.n(digits=22))
- ----------------- Range Kuta -------------------
- e)
- def RK4(f,a,b,N,y0):
- h=(b-a)/N #paso
- nodos = [a] #Inicializamos una lista nodos con el n primer nodo
- aprox = [y0] #Inicializamos una lista aprox con la n condicióninicial
- for k in range(N):
- K1=f(nodos[k], aprox[k])
- K2=f(nodos[k]+0.5*h, aprox[k]+0.5*h*K1)
- K3=f(nodos[k]+0.5*h, aprox[k]+0.5*h*K2)
- K4=f(nodos[k]+h, aprox[k]+h*K3)
- nodos.append(nodos[k]+h) #Siguiente nodo
- yRK4=aprox[k]+h*(K1+2*K2+2*K3+K4)/6
- aprox.append(yRK4) #Siguiente aproximacion
- return matrix(zip(nodos, aprox)) #Devolvemos cada nodo con su aproximación
- RK4_ej1 = RK4(f,1,3,N,1/2).n(digits=11)
- show(RK4_ej1)
- errorRK4_ej1 = error(sol_ex, RK4_ej1.n(digits=22))
- ----------------- EDO segundo orden -------------
- a)
- x = var('x')
- y = function('y',x)
- edo2 = diff(y,x,2)-4*diff(y,x)+6*y == 10*e^(x/2)
- sol_gen2 = desolve(edo2,[y,x])
- show(sol_gen2)
- b)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement