Академический Документы
Профессиональный Документы
Культура Документы
ECUACIONES ALGEBRAICAS - 2
Solución
+
0 x
-
Segmento
donde ocurre
Incremento el cambio de
signo
x x x x x x
+
- 0 x
x1 x2
Solución
f1 = f(x1)
x2 = x1+dx
f2 = f(x2)
[else] [f1*f2<0]
[else] [c=li]
Límite de
c =c+1 mostrar x2 iteraciones devolver x1
alcanzado
x 1 = x2 generar error
x original
Nuevo
incremento Nuevo
segmento de
solución
x x x x x x
0 x1 x2
Solución
ans = -3.794452456604702E-4
En consecuencia la solución se encuentra entre 3.608 y 3.610. Prosiguien-
do de esa manera, se puede ir reduciendo el segmento de solución hasta que
el valor inicial (o final) del segmento pueda ser considerado como la solu-
ciones buscada. Así, en este punto se puede afirmar que la solución es 3.61
(con 3 dígitos de precisión).
El algoritmo que automatiza el proceso es el siguiente:
incr2: Solución de una ecuación algebraica
por el método incremental.
[else] [|dx|<err]
[else] [c = li]
Límite de
c = c+1 mostrar x1 iteraciones devolver x1
alcanzado
dx = dx/10 generar error
3.1.3. Ejemplos
3 x 2.1 – 5 y=7.0
1.2
y +4 z=14.3
x+ y 2 +z 2=14.0
Primero se coloca el sistema en función de una sola variable:
3 x 2.1−7.0
y=
5
14.3− y 1.2
z=
4
f (x )=x+ y +z 2 −14.0=0
2
Se programa la función
function r=fx5(x)
y=(3*x^2.1-7)/5;
z=(14.3-y^1.2)/4;
r=x+y^2+z^2-14;
end
- 36 - Hernán Peñaranda V.
3.1.4. Ejercicios
2 x 2+5 x y – 4 x=115
x+ y
e 5
+ x 2 y 2 – 70 y=15
2. Encuentre la o las soluciones de la siguiente función con 9 dígitos de
precisión (o exactitud) y un límite de 50 iteraciones. Estime los valo-
res iniciales mediante la gráfica de la función.
ECUACIONES ALGEBRAICAS - 2 - 37 -
15 y+20 x 2 − x 3=1500
x
2 2
9z−1. 5x +e =300
y 2 −z 3 −5x=166 .81
3.2. MÉTODO DE LA BISECCIÓN (O MÉTODO DE BOLTZANO)
segmento original
nuevo segmento
x1 x3 x2 x
0
Valor de prueba
0.36
f (x )=( 52+3 √ x−8x 0.8 ) − x=0
Primero se programa la función:
>> function r=fx(x) r=(52+3*sqrt(x)-8*x^0.8)^0.36-x; end
Se encuentra el segmento de solución con “incr1”:
>> incr1($fx,1.1,1,100)
x1 = 3.1
Por lo tanto la solución se encuentra entre “x 1=3.1” y “x2=4.1”. Se calcu-
la el valor de la función en “x1” y el nuevo valor de “x”:
>> x1=3.1; x2=4.1; f1=fx(x1), x3=(x1+x2)/2, f3=fx(x3)
f1 = 0.5869622889544366
x3 = 3.5999999999999996
f3 = 0.011149591389499225
Como “f1” y “f3” tienen el mismo signo la solución se encuentra a la de-
recha del segmento:
>> x1=x3; x3=(x1+x2)/2, f3=fx(x3)
x3 = 3.8499999999999996
f3 = -0.27724585235700516
Ahora “f1” (positivo) y “f3” tienen diferente signo, por lo tanto la so-
lución se encuentra a la izquierda del segmento:
>> x2=x3; x3=(x1+x2)/2, f3=fx(x3)
x3 = 3.7249999999999996
f3 = -0.1330032269091932
Se prosigue de esta manera, llevando a cabo uno de los dos cambios de va-
riables mostrados. Para evitar el tener que hacer el cambio manualmente, se
puede emplear la estructura if-then-else:
>> if f1*f3<0 x2=x3; else x1=x3; end x3=(x1+x2)/2, f3=fx(x3)
x3 = 3.6624999999999996
f3 = -0.06091589970912015
Ejecutando esta instrucción algunas veces más se obtiene:
>> if f1*f3<0 x2=x3; else x1=x3;; end x3=(x1+x2)/2, f3=fx(x3)
x3 = 3.6312499999999996
f3 = -0.024880463221144566
>> if f1*f3<0 x2=x3; else x1=x3;; end x3=(x1+x2)/2, f3=fx(x3)
x3 = 3.6156249999999996
f3 = -0.0068647680102214
>> if f1*f3<0 x2=x3; else x1=x3;; end x3=(x1+x2)/2, f3=fx(x3)
x3 = 3.6078124999999996
f3 = 0.002142578061902878
>> if f1*f3<0 x2=x3; else x1=x3;; end x3=(x1+x2)/2, f3=fx(x3)
x3 = 3.6117187499999996
f3 = -0.002361053305552474
>> if f1*f3<0 x2=x3; else x1=x3;; end x3=(x1+x2)/2, f3=fx(x3)
x3 = 3.6097656249999996
f3 = -1.0922721411521508E-4
>> if f1*f3<0 x2=x3; else x1=x3;; end x3=(x1+x2)/2, f3=fx(x3)
x3 = 3.6087890624999996
f3 = 0.0010166780246407825
>> if f1*f3<0 x2=x3; else x1=x3;; end x3=(x1+x2)/2, f3=fx(x3)
x3 = 3.6092773437499996
ECUACIONES ALGEBRAICAS - 2 - 39 -
f3 = 4.5372605559768076E-4
>> if f1*f3<0 x2=x3; else x1=x3;; end x3=(x1+x2)/2, f3=fx(x3)
x3 = 3.6095214843749996
f3 = 1.722495833433868E-4
>> if f1*f3<0 x2=x3; else x1=x3;; end x3=(x1+x2)/2, f3=fx(x3)
x3 = 3.6096435546874996
f3 = 3.151122526690031E-5
>> if f1*f3<0 x2=x3; else x1=x3;; end x3=(x1+x2)/2, f3=fx(x3)
x3 = 3.6097045898437496
f3 = -3.885798426050968E-5
>> if f1*f3<0 x2=x3; else x1=x3;; end x3=(x1+x2)/2, f3=fx(x3)
x3 = 3.6096740722656246
f3 = -3.6733769555041818E-6
>> if f1*f3<0 x2=x3; else x1=x3;; end x3=(x1+x2)/2, f3=fx(x3)
x3 = 3.609658813476562
f3 = 1.391892479096768E-5
>> if f1*f3<0 x2=x3; else x1=x3;; end x3=(x1+x2)/2, f3=fx(x3)
x3 = 3.6096664428710934
f3 = 5.122774076493641E-6
>> if f1*f3<0 x2=x3; else x1=x3;; end x3=(x1+x2)/2, f3=fx(x3)
x3 = 3.609670257568359
f3 = 7.246986006848033E-7
Como se puede observar el método converge lentamente hacia la solución
(el valor de la función se acerca cada vez más a cero). A pesar de ello,
este método es por lo general más rápido (requiere menos iteraciones) que
el método incremental.
f1 = f(x1)
x 3 =(x 1+x2)/2
[|x2/x3-1|<err]
f3 = f(x3)
[else] [|f3|<err]
devolver x 3
[else] [c = li]
Límite de
c = c+1 iteraciones
mostrar x3 alcanzado.
[else] [f1*f3< 0]
generar error
x1 = x3 x2 = x 3
function x3=biseccion(f,x1,x2,err,li)
c=1; f1=f(x1);
while 1
x3=(x1+x2)/2;
printf("%f: x=%f\n",c,x3);
if abs(x2/x3-1)<err break; end
f3=f(x3);
if abs(f3)<err break; end
if c++ == li error("error biseccion: %f\n",x3); end
if f1*f3<0 x2=x3; else x1=x3; end
end
end
Llamando al método con la función “fx” y los valores iniciales determina-
dos previamente (x1=3.1, x2=4.1), para un error igual a 1e-14, se obtiene:
>> biseccion($fx,3.1,4.1,1e-14,100)
1.0: x=3.5999999999999996
2.0: x=3.8499999999999996
3.0: x=3.7249999999999996
4.0: x=3.6624999999999996
5.0: x=3.6312499999999996
6.0: x=3.6156249999999996
7.0: x=3.6078124999999996
8.0: x=3.6117187499999996
9.0: x=3.6097656249999996
10.0: x=3.6087890624999996
11.0: x=3.6092773437499996
12.0: x=3.6095214843749996
13.0: x=3.6096435546874996
14.0: x=3.6097045898437496
15.0: x=3.6096740722656246
16.0: x=3.609658813476562
17.0: x=3.6096664428710934
18.0: x=3.609670257568359
19.0: x=3.609672164916992
20.0: x=3.6096712112426754
21.0: x=3.6096707344055172
22.0: x=3.6096709728240963
23.0: x=3.6096708536148068
24.0: x=3.6096709132194515
25.0: x=3.609670883417129
26.0: x=3.6096708983182904
27.0: x=3.6096708908677098
28.0: x=3.6096708871424195
29.0: x=3.6096708852797743
30.0: x=3.609670886211097
31.0: x=3.6096708857454356
32.0: x=3.6096708859782662
33.0: x=3.6096708860946816
34.0: x=3.6096708861528892
35.0: x=3.6096708861237854
36.0: x=3.6096708861383373
37.0: x=3.6096708861456133
38.0: x=3.6096708861419753
39.0: x=3.6096708861401563
40.0: x=3.609670886139247
41.0: x=3.6096708861397016
42.0: x=3.609670886139929
ECUACIONES ALGEBRAICAS - 2 - 41 -
43.0: x=3.6096708861400426
x3 = 3.6096708861400426
Como se puede ver, bisección requiere 43 iteraciones para obtener el re-
sultado con una exactitud o precisión de 14 dígitos, lo que como se dijo
son todavía muchas iteraciones, pero menos que las requeridas por el método
incremental.
Una vez probado el programa la impresión de resultados intermedios puede
ser suprimido (anteponiendo % delante de “printf”).
3.2.2. Ejemplos
>> biseccion($fx6,0.75,0.85,1e-10,50)
x3 = 0.7675025617238134
Que son las dos soluciones buscadas.
Puesto que el método de la bisección sólo requiere dos valores a ambos
lados de la solución, no es imprescindible el uso del método incremental,
dichos valores pueden ser obtenidos también de la gráfica. Así por ejemplo,
analizando la gráfica de la función:
>> x6=0:0.01:0.8; y6=fx6(x6); plot(x6,y6)
3.2.3. Ejercicios
segmento original
nuevo segmento
0 x1 x3 x2
x
Nuevo valor en la
siguiente iteración
Nuevo valor
de prueba
x p = x1
f1 = f(x1)
f2 = f(x2)
x 3 =(f2*x1-f1*x2)/(f2-f1)
[else] [|xp/x3-1|<err]
f3 = f(x3)
[|f3|<err]
devolver x3
[else]
[else] [c = li]
c = c+1 Límite de
iteraciones
[else] [f1*f3<0] mostrar x3
alcanzado
x1 = x 3 x2 = x3
generar error
f1 = f3 f2 = f3
xp = x 3
3.3.2. Ejemplos
3.3.3. Ejercicios
15 y + 20 x 2 − x 3 = 1500
x
9 z − 1.5 x 2 + e 2 = 300
y 2 − z 3 − 5 x = 166.81
En este método se asumen dos valores iniciales, los cuales por lo general
son dos valores consecutivos y con los mismos se calcula un nuevo valor de
prueba "x3" por interpolación o extrapolación lineal, tal como se muestra en
la figura:
Puntos iniciales
Nuevo valor
de prueba
x6 x4
0 x1 x 2 x5 x3
Valores iniciales
x
Solución
Nuevo punto
0.36
f (x )=( 52+3 √ x−8x 0.8 ) − x=0
Cuyo programa es:
>> function r=fx(x) r=(52+3*sqrt(x)-8*x^0.8)^0.36-x; end
Se asumirán como valores iniciales dos valores consecutivos: x 1=1.1 y
x2=1.2 (si se conocen los valores a ambos lados de la solución, entonces de-
berían emplearse dichos valores):
>> x1=1.1; x2=1.2; f1=fx(x1); f2=fx(x2); x3=(f2*x1-f1*x2)/(f2-f1),
f3=fx(x3)
x3 = 3.609447345727945
f3 = 2.577261123910546E-4
Ahora se hace el cambio de variables y se calcula un nuevo valor de “x”:
>> x1=x2;x2=x3;f1=f2;f2=f3;f2=fx(x2); x3=(f2*x1-f1*x2)/(f2-f1),f3=fx(x3)
x3 = 3.609671616839671
f3 = -8.424448663113537E-7
Como se ve, con una sola repetición la función ya se acerca a cero. Repi-
tiendo el proceso unas cuantas veces más, se obtiene:
>> x1=x2;x2=x3;f1=f2;f2=f3;f2=fx(x2); x3=(f2*x1-f1*x2)/(f2-f1),f3=fx(x3)
x3 = 3.609670886139664
f3 = 4.454214774796128E-13
>> x1=x2;x2=x3;f1=f2;f2=f3;f2=fx(x2); x3=(f2*x1-f1*x2)/(f2-f1),f3=fx(x3)
x3 = 3.6096708861400497
f3 = 4.440892098500626E-16
>> x1=x2;x2=x3;f1=f2;f2=f3;f2=fx(x2); x3=(f2*x1-f1*x2)/(f2-f1),f3=fx(x3)
x3 = 3.60967088614005
f3 = 0.0
Que es el resultado exacto (encontrado en tan solo 4 iteraciones).
f1 = f(x1)
f2 = f(x2)
x3 = (f2*x 1-f1*x2)/(f2-f1)
[|x2/x3-1|<err]
[else]
f3 = f(x3)
[else] [|f3|<err]
devolver x3
[else] [c = li]
c = c+1
mostrar x3
x1 = x 2
f1 = f2 generar error
x2 = x 3
f2 = f3
3.4.2. Ejemplos
y1 =1.42 x1
Lc =L0 (1−x 0 )
M = L0+V 0
C 0= L0 x 0+V 0 y 0
L0=300 ; x 0 =0 ;
V 0 =100 ; y 0 =0.2
Esta función ya fue resuelta por el método de la bisección siendo su pro-
grama:
function r=fx6(x1)
L0=300; x0=0; V0=100; y0=0.2;
C0=L0*x0+V0*y0;
M=L0+V0;
Lc=L0*(1-x0);
y1=1.42*x1;
L1=Lc/(1-x1);
V1=M-L1;
r=L1*x1+V1*y1-C0;
end
Como se vio en dicho método existen 2 soluciones, para encontrar la pri-
mera se dan valores cercanos a 0.1:
>> secante($fx6,0.1,0.12,1e-10,50)
x3 = 0.04587771997385179
Y para la segunda, cercanos a 0.7:
>> secante($fx6,0.7,0.71,1e-10,50)
x3 = 0.7675025617162897
3.4.3. Ejercicios
2 x 2+5 x y – 4 x=115
x+ y
e 5
+ x 2 y 2 – 70 y=15
3.5. MÉTODO DE NEWTON – RAPHSON
f(x1)
f(x2)
Solución
α
x
0 x2 x1
La ecuación para el cálculo del nuevo valor de prueba (x2) puede ser dedu-
cida del triángulo que forman la tangente con los segmentos:
f ( x 1)−0
tan (α)= f '( x1 )=
x1 – x 2
f ( x 1)
x 1 – x 2=
f '(x 1)
f ( x 1)
x 2= x 1− (3.5)
f '( x 1 )
Que es la ecuación del método de Newton – Raphson. Como se puede ver
implica el cálculo de la derivada de la función.
Si bien en ocasiones el cálculo de la derivada analítica puede ser
simple, en otros es muy complejo e incluso imposible (en funciones
compuestas por ejemplo), por lo que la mejor alternativa radica en el
cálculo numérico de la derivada.
Para ello, se empleará la fórmula de diferencia central de segundo orden
(cuya deducción se verá en un tema posterior):
f ( x+h)− f ( x−h)
f ' ( x)= (3.6)
2h
Donde “h” es el incremento de “x”. En teoría mientras más pequeño sea el
valor de “h” más exacto será el resultado calculado con la ecuación. En la
práctica, sin embargo, no es así (debido a los errores de redondeo). Un va-
lor que resulta adecuado para “h” en la mayoría de los casos es:
h=x 1×10−6 .
Para comprender mejor como opera el método, se resolverá (una vez más) la
ecuación:
0.36
f (x )=( 52+3 √ x−8x 0.8 ) − x=0
Cuyo programa es:
>> function r=fx(x) r=(52+3*sqrt(x)-8*x^0.8)^0.36-x; end
Para calcular la derivada se programa la ecuación (3.6):
ECUACIONES ALGEBRAICAS - 2 - 53 -
f1 = f(x 1)
[|f1|<err]
h = x 1*10-6
df =(f(x1+h)-f(x1-h))/(2h)
x2 =x 1-f1/df devolver x 1
3.5.2. Ejemplos
3 3
Si “x” es la fracción del radio que está sumergida, se cumple que:
x⋅r=h
Reemplazando esta relación en la anterior ecuación se tiene:
4 3
π r d = π ( 3⋅r⋅x 2 r 2 – x 3 r 3 )
3 3
ECUACIONES ALGEBRAICAS - 2 - 55 -
4 3
π r d = π r ( 3⋅x – x )
3 2 3
3 3
f (x )=x 3 – 3 x 2+4d=0
Por lo tanto, esta es la ecuación que debe ser resuelta para dar
respuesta al problema.
Dado que en este caso se trata de un problema físico, no sólo matemático,
es necesario tomar en cuenta que la densidad “d” de la esfera no puede ser
mayor a 1, pues de ser así la esfera se sumergiría completamente llegando
hasta el fondo del recipiente.
La imposibilidad de crear variables globales y sub-funciones en Jasymca,
obliga a crear una función, donde sea necesario modificar manualmente el
valor de la densidad “d”. Así para d=0.4 la función es:
>> function r=e1nr(x) d=0.4; r=x^3-3*x^2+4*d; end
Llamando a “newton” con esta función se obtiene:
>> newton($e1nr,1.1,1e-9,30)
x2 = 0.8658621542954691
Cambiando el valor de “d” a 0.6 y volviendo a llamar a “newton” se obtie-
ne:
>> function r=e1nr(x) d=0.6; r=x^3-3*x^2+4*d; end
>> newton($e1nr,1.1,1e-9,30)
x2 = 1.1341378457045366
De la misma forma se obtienen las otras dos soluciones:
>> function r=e1nr(x) d=0.9; r=x^3-3*x^2+4*d; end
>> newton($e1nr,1.1,1e-9,30)
x2 = 1.6083997884757761
end
Llamando a “newton” con esta función se obtiene:
>> newton($fx4,55.1,1e-14,30)
x2 = 74.67669629022704
Si se emplea un valor inicial alejado de la solución conocida, se obtie-
ne:
>> newton($fx4,1.1,1e-14,30)
x2 = 2567.837445653622
Que es otra de las soluciones de la función.
3.5.3. Ejercicios
15 y + 20 x 2 − x 3 = 1500
x
9 z − 1.5 x 2 + e 2 = 300
y 2 − z 3 − 5 x = 166.81
10. Encuentre la solución de la siguiente ecuación, con 7 dígitos de preci-
sión, empleando el método de Wegstein. Estime el valor inicial elabo-
rando la gráfica de la función.
P⋅V V Ω b
f (V )= – + a F
R⋅T V – b Ωb V +b
Ωa RT c
b=
Pc
1 2
F=
Tr [1+( 0.480+1.574 ω−0.176 ω 2 ) (1−T 0.5
r )]
T
T r=
Tc
−1
Ωa=[ 9 ( 2 1/ 3−1 ) ]
2 1/ 3−1
Ωb=
3
T =400 ; P=20 ; T c =190.6 ;
P c =45.4 ; ω=0.008 ; R=0.08206