Problema 9 Problema 9 (cont.)

Anuncio
Problema 9
UNIVERSIDAD
DE CANTABRIA
Escribir un programa que permita obtener la derivada de una
función de la variable X, expresada mediante un árbol binario, que
contenga:
• números reales constantes
• la variable X
• y los operadores binarios +,-,*,/ y ^ (elevar a).
Los métodos de la clase a desarrollar son:
• El constructor, que recibe como argumento de entrada el árbol
con la expresión a derivar.
• Un método que realiza la derivada de la expresión.
• Un método que realiza la simplificación de una expresión.
DEPARTAMENTO DE MATEMÁTICAS,
ESTADÍSTICA
Y COMPUTACIÓN
4
© Michael González Harbour y Patricia López
2/nov/09
1
Problema 9 (cont.)
UNIVERSIDAD
DE CANTABRIA
Para llevar a cabo la derivación y simplificación se utilizarán las
siguientes reglas:
Der(cte) = 0
Der(X) = 1
Der(U±V) = Der(U) ± Der(V)
Der(U*V) = U*Der(V) + V*Der(U)
Der(U/V) = ((V*Der(U)) - (U*Der(V)))/V**2
Der(U^V) = V*(U^(V-1))*Der(U)
DEPARTAMENTO DE MATEMÁTICAS,
ESTADÍSTICA Y COMPUTACIÓN
© Michael González Harbour y Patricia López
2/nov/09
S±0=S
0+S=S
0-S=-S
S*0=0
0*S=0
S*1=S
1*S=S
0/S=0
S^0=1
S^1=S
2
Problema 9 (cont.)
UNIVERSIDAD
DE CANTABRIA
Pseudocódigo:
metodo deriva (Iterador<ElementoDeExpresion> iter)
retorna ArbolBinCE <ElementoDeExpresion>
si iter es una hoja entonces
si
iter.contenido es una Constante =>
retorna nuevo ArbolBinCE (cero)
iter.contenido es una Variable =>
retorna nuevo ArbolBinCE (uno)
fsi
si no // es un operador
DEPARTAMENTO DE MATEMÁTICAS,
ESTADÍSTICA Y COMPUTACIÓN
© Michael González Harbour y Patricia López
2/nov/09
Problema 9 (cont.)
3
UNIVERSIDAD
DE CANTABRIA
si
iter.contenido = ‘+’ | ‘-’ =>
retorna nuevo ArbolBinCE (‘+’ o ‘-’,
deriva(ramaIzquierda),
deriva(ramaDerecha)
iter.contenido = ‘*’ =>
retorna nuevo ArbolBinCE (‘+’,
ramaIzquierda*deriva(ramaDerecha),
deriva(ramaIzquierda)*ramaDerecha)
...
fsi
fsi
fmétodo
DEPARTAMENTO DE MATEMÁTICAS,
ESTADÍSTICA Y COMPUTACIÓN
© Michael González Harbour y Patricia López
2/nov/09
4
Problema 9 (cont.)
UNIVERSIDAD
DE CANTABRIA
método simplifica
(ArbolBin<ElementoDeExpresion> arbol)
retorna ArbolBin<ElementoDeExpresion>
boolean hayCambios;
ArbolBin<ElementoDeExpresion> nuevo=arbol
hacer
hayCambios:=false;
nuevo:=simplificaUnaVez(nuevo)
mientras hayCambios
retorna nuevo
fmétodo
El metodo simplifica usa un metodo auxiliar
simplificaUnaVez, que hace una simplificación y anota en
hayCambios si ha habido cambios o no
DEPARTAMENTO DE MATEMÁTICAS,
ESTADÍSTICA Y COMPUTACIÓN
© Michael González Harbour y Patricia López
2/nov/09
Problema 9 (cont.)
5
UNIVERSIDAD
DE CANTABRIA
metodo simplifica_una_vez
(ArbolBin<ElementoDeExpresion> arbol)
retorna ArbolBin<ElementoDeExpresion>
IterARbolBin<ElementoDeExpresion> iter =
arbol.iterador();
si iter es una hoja entonces
retorna arbol;
fsi;
si
iter.contenido = ‘+’ | ‘-’ =>
si ramaIzquierda de iter es = 0 entonces
hayCambios=true;
retorna simplificaUnaVez
(ramaDerecha de iter);
fsi
DEPARTAMENTO DE MATEMÁTICAS,
ESTADÍSTICA Y COMPUTACIÓN
© Michael González Harbour y Patricia López
2/nov/09
6
Problema 9 (cont.)
UNIVERSIDAD
DE CANTABRIA
// Igual para la rama izquierda
..
fsi
// si llegamos aquí, no ha habido simplificación
retorna nuevo ArbolBinCE<ElementoDeExpresion>
(iter.contenido(),
simplificaUnaVez (RamaIzquierda de iter),
simplificaUnaVez (RamaDerecha de iter));
fmétodo
DEPARTAMENTO DE MATEMÁTICAS,
ESTADÍSTICA Y COMPUTACIÓN
© Michael González Harbour y Patricia López
2/nov/09
7
Descargar