Este documento presenta el código en Matlab y Python para resolver sistemas de ecuaciones no lineales utilizando el método de Newton-Raphson. Incluye la clase Senl que define los métodos para hallar la solución de un sistema, como newton() y jacobiano(). También muestra un ejemplo de aplicación para determinar el coeficiente de arrastre de un automóvil y la resolución de un sistema de dos ecuaciones.
1. Examen: Martinano Condori Quilla
Ejercicio 01:
Código matlab:
x0=input('Ingrese el valor inicial: ');
tol=input('Ingrese el porcentaje de error: ');
f=input('Ingrese la función: ');
i=1;
fx(i)=x0;
syms x;
f1=subs(f,x,fx(i));
z=diff(f);
d=subs(z,x,fx(i));
ea(1)=100;
while abs(ea(i))>=tol;
fx(i+1)=fx(i)-f1/d; f1=subs(f,x,fx(i+1)); d=subs(z,x,fx(i+1));
ea(i+1)=abs((fx(i+1)-fx(i))/fx(i+1)*100);
i=i+1;
end
fprintf('i fx(i) Error aprox (i) n');
for j=1:i;
fprintf('%2d t %11.7f t %7.3f n',j-1,fx(j),ea(j));
end
Código en Python:
# -*- coding: utf-8 -*-
"""
Editor de Spyder
2. Este es un archivo temporal
Escuela profesional de ingenieria civil
Autor: Martiniano Condori Huahuamullo
"""
import numpy
class Senl:
'''
Clase que define un sistema de ecuaciones no lineales y diferentes
metodos para hallar su solucion
'''
def __init__(self):
pass
def newton(self, paso, numero):
return 0
def llamada_funcion(self, x, a):
resultado = self.funcion(x, a)
return numpy.array(resultado)
def jacobiano(self, x, a, tol=0.001):
res = []
xtemp = numpy.array(x)
x1 = xtemp.copy()
for i in range(len(x1)):
3. x2 = x1.copy()
x2[i] += tol
r = (self.llamada_funcion(x2, a) -
self.llamada_funcion(x1, a)) / tol
res.append(r)
jac = numpy.array(res[0])
for i in range(len(res) - 1):
jac = numpy.vstack((jac, numpy.array(res[i + 1])))
return jac.transpose()
def solver_newton(self, x0, a, max_iter=50, tol=0.0001):
x1 = numpy.array(x0)
e = 1.0
iteracion = 0
while iteracion < max_iter and e > tol:
A = self.jacobiano(x1, a)
B = self.llamada_funcion(x1, a)
res = numpy.linalg.solve(A, B)
x1 = x1 - res
e1 = abs(res.max())
e2 = abs(res.min())
e = max([e1, e2])
print("error: ", e)
print("Nº iteracion: ", iteracion)
iteracion += 1
return x1
4. if __name__ == '__main__':
def f(x, a):
r = [0.0] * 2
r[0] = x[0] * x[1] - a[0]
r[1] = x[0] + x[1] - a[1]
return r
def drag(x, a):
'''
funcion para determinar el coeficiente de rodadura de un coche
x[0] sera el coeficiente de rodadura
a[0] sera el producto del coeficiente aerodinamico por la superficie
frontal
a[1] sera la velocidad maxima del coche
a[2] sera la masa del coche
a[3] sera la potencia maxima del coche
'''
r = [0.0] * 2
rho = 1.204
r[0] = 0.5 * rho * a[0] * a[1]**3 + x[0] * a[2] * 9.81 * a[1] - a[3]
r[1] = x[1] - x[0]
return r
sistema = Senl()
sistema.funcion = drag
print(sistema.solver_newton(x0=[1.0, 0.0],
5. a=[0.61, 56.67, 1340.0, 90000.0]))
Ejercicio 02: Del gráfico adjunto
Ejercicio 03: Se requiere resolver el sistema de ecuaciones no lineales
−𝑥 + 2𝑦 − 4 = 0
(𝑥 − 6)2
− 𝑦 + 2 = 0
Resolviendo la ecuación se tiene:
−𝑥 + 2𝑦 − 4 = 0
𝑥2
− 12𝑥 − 𝑦 + 38 = 0
1. Halle el sistema de ecuaciones y el Jacobiano
𝐹( 𝑥) = [
−𝑥1 + 2𝑥2 − 4
(𝑥1 − 6)2
− 𝑥2 + 2
]
𝐹𝑛
′( 𝑥 𝑘) = 𝐽( 𝑥) = [
𝑑𝑓
𝑑𝑥1
𝑑𝑓
𝑑𝑥2
𝑑𝑔
𝑑𝑥1
𝑑𝑔
𝑑𝑥2
]=[ ]
2. Ejecutar el promama NEWTON_NL, con un punto inicial [
1
2
] con un
parámetro de precisión 0,000001, observamos:
3. Ahora ejecutando NEWTON_NL, con otro punto inicial [
9
3
] tenemos:
Que converge a otra raíz: