(*********************************************************************** Mathematica-Compatible Notebook This notebook can be used on any computer system with Mathematica 3.0, MathReader 3.0, or any compatible application. The data for the notebook starts with the line of stars above. To get the notebook into a Mathematica-compatible application, do one of the following: * Save the data starting with the line of stars above into a file with a name ending in .nb, then open the file inside the application; * Copy the data starting with the line of stars above to the clipboard, then use the Paste menu command inside the application. Data for notebooks contains only printable 7-bit ASCII and can be sent directly in email or through ftp in text mode. Newlines can be CR, LF or CRLF (Unix, Macintosh or MS-DOS style). NOTE: If you modify the data for this notebook not in a Mathematica- compatible application, you must delete the line below containing the word CacheID, otherwise Mathematica-compatible applications may try to use invalid cache data. For more information on notebooks and Mathematica-compatible applications, contact Wolfram Research: web: http://www.wolfram.com email: info@wolfram.com phone: +1-217-398-0700 (U.S.) Notebook reader applications are available free of charge from Wolfram Research. ***********************************************************************) (*CacheID: 232*) (*NotebookFileLineBreakTest NotebookFileLineBreakTest*) (*NotebookOptionsPosition[ 31312, 710]*) (*NotebookOutlinePosition[ 32018, 735]*) (* CellTagsIndexPosition[ 31974, 731]*) (*WindowFrame->Normal*) Notebook[{ Cell["\<\ Soluciones de los ejercicios del examen de pr\[AAcute]cticas de \ An\[AAcute]lisis Matem\[AAcute]tico de primer curso (grupo A) de Ingenier\ \[IAcute]a Superior de Inform\[AAcute]tica\ \>", "Title"], Cell["\<\ Francisco Javier P\[EAcute]rez Gonz\[AAcute]lez Departamento de An\[AAcute]lisis Matem\[AAcute]tico Universidad de Granada\ \>", "Author"], Cell[CellGroupData[{ Cell["Ejercicio 1", "Section"], Cell[TextData[{ "Haz un programa para calcular ra\[IAcute]ces de una funci\[OAcute]n en un \ intervalo usando el m\[EAcute]todo de bisecci\[OAcute]n. El programa debe \ admitir como datos de entrada la funci\[OAcute]n, los extremos del intervalo \ y el error admitido; y debe proporcionar la soluci\[OAcute]n encontrada, el n\ \[UAcute]mero de pasos que han sido necesarios para calcularla y la cota de \ error permitida. Debes evitar la posibilidad de que al ejecutar el programa \ se entre en un ``bucle infinito''.\nAplica a los siguientes casos el programa \ que has escrito.\na) ", Cell[BoxData[ FormBox[ RowBox[{\(f(x)\), "=", RowBox[{\(2 x\), "-", RowBox[{"sen", " ", FormBox[\(x - e\^x\), "TraditionalForm"]}]}]}], TraditionalForm]]], " en el intervalo [0,1] y cota de error ", Cell[BoxData[ \(TraditionalForm\`10\^\(-4\)\)]], ".\nb) ", Cell[BoxData[ \(TraditionalForm\`g(x) = x\^6 - 3 x\^5 + 2 x\^3 + 3 x\^2 - x - 1\)]], " en el intervalo [1.55,2.55] y cota de error ", Cell[BoxData[ \(TraditionalForm\`10\^\(-4\)\)]], "." }], "Text"], Cell[CellGroupData[{ Cell["Soluci\[OAcute]n", "Subsection"], Cell[TextData[{ "Este ejercicio es \"cl\[AAcute]sico\" y est\[AAcute] propuesto en la pr\ \[AAcute]ctica 5 cuyo t\[IAcute]tulo es ", StyleBox["Resoluci\[OAcute]n de ecuaciones: M\[EAcute]todos de bisecci\ \[OAcute]n y de Newton-Raphson. ", FontSlant->"Italic"], "Adem\[AAcute]s, dentro de su estilo, es el ejercicio m\[AAcute]s \ f\[AAcute]cil que se puede poner pues ni siquiera es preciso conocer ", StyleBox["Mathematica", FontSlant->"Italic"], " para hacerlo correctamente. Solamente hay que hacer un sencillo bucle con \ dos condicionamientos y eso puede hacerlo cualquiera que tenga conocimientos \ b\[AAcute]sicos de alg\[UAcute]n lenguaje de programaci\[OAcute]n. Por si eso \ fuera poco, dispon\[IAcute]ais de la ayuda de ", StyleBox["Mathematica", FontSlant->"Italic"], " y de cualquier informaci\[OAcute]n que hubi\[EAcute]rais tra\[IAcute]do \ al examen (apuntes, ejercicios resueltos de pr\[AAcute]cticas, tutoriales de \ ", StyleBox["Mathematica,...", FontSlant->"Italic"], ") - dicho sea de paso, el ejercicio est\[AAcute] resuelto en un tutorial \ de ", StyleBox["Mathematica", FontSlant->"Italic"], " que est\[AAcute] en el directorio de la asignatura." }], "Text"], Cell[BoxData[ RowBox[{\( (*\ Soluci\[OAcute]n\ b\[AAcute]sica\ *) \), "\[IndentingNewLine]", \( (*\ a = \ N[aqu\[IAcute]\ se\ pone\ el\ extremo\ inferior\ del\ \ intervalo]\ *) \), "\[IndentingNewLine]", \( (*\ naturalmente, \ se\ usa\ N[]\ para\ trabajar\ num\[EAcute]ricamente\ *) \), \( (*\ b = \ N[aqu\[IAcute]\ se\ pone\ el\ extremo\ superior\ del\ \ intervalo]\ *) \), "\[IndentingNewLine]", " ", \( (*\ f[x_] = \ aqu\[IAcute]\ va\ la\ funci\[OAcute]n\ *) \), "\[IndentingNewLine]", " ", \( (*\ error = \ N[aqu\[IAcute]\ se\ pone\ el\ error\ permitido]\ *) \), "\[IndentingNewLine]", RowBox[{"(*", " ", RowBox[{ RowBox[{ "Es", " ", "evidente", " ", "que", " ", "el", " ", "error", " ", "que", " ", "se", " ", "comete", " ", "al", " ", "calcular", " ", "la", " ", "ra\[IAcute]z", " ", "es", " ", "menor", " ", "que", " ", "la", " ", "longitud", " ", "del", " ", \(intervalo . \ Por\), " ", "tanto", " ", "debemos", " ", "hacer", " ", "iteraciones", " ", StyleBox["hasta", FontSlant->"Italic", FontColor->RGBColor[1, 0, 0]], StyleBox[" ", FontSlant->"Italic", FontColor->RGBColor[1, 0, 0]], StyleBox["que", FontSlant->"Italic", FontColor->RGBColor[1, 0, 0]], StyleBox[" ", FontSlant->"Italic", FontColor->RGBColor[1, 0, 0]], StyleBox["la", FontSlant->"Italic", FontColor->RGBColor[1, 0, 0]], StyleBox[" ", FontSlant->"Italic", FontColor->RGBColor[1, 0, 0]], StyleBox["longitud", FontSlant->"Italic", FontColor->RGBColor[1, 0, 0]], StyleBox[" ", FontSlant->"Italic", FontColor->RGBColor[1, 0, 0]], StyleBox["del", FontSlant->"Italic", FontColor->RGBColor[1, 0, 0]], StyleBox[" ", FontSlant->"Italic", FontColor->RGBColor[1, 0, 0]], StyleBox["intervalo", FontSlant->"Italic", FontColor->RGBColor[1, 0, 0]], StyleBox[" ", FontSlant->"Italic", FontColor->RGBColor[1, 0, 0]], StyleBox["sea", FontSlant->"Italic", FontColor->RGBColor[1, 0, 0]], StyleBox[" ", FontSlant->"Italic", FontColor->RGBColor[1, 0, 0]], StyleBox["menor", FontSlant->"Italic", FontColor->RGBColor[1, 0, 0]], StyleBox[" ", FontSlant->"Italic", FontColor->RGBColor[1, 0, 0]], StyleBox["que", FontSlant->"Italic", FontColor->RGBColor[1, 0, 0]], StyleBox[" ", FontSlant->"Italic", FontColor->RGBColor[1, 0, 0]], StyleBox["el", FontSlant->"Italic", FontColor->RGBColor[1, 0, 0]], StyleBox[" ", FontSlant->"Italic", FontColor->RGBColor[1, 0, 0]], StyleBox["error", FontSlant->"Italic", FontColor->RGBColor[1, 0, 0]], StyleBox[" ", FontSlant->"Italic", FontColor->RGBColor[1, 0, 0]], RowBox[{ StyleBox["permitido", FontSlant->"Italic", FontColor->RGBColor[1, 0, 0]], ".", " ", "Como"}], " ", "en", " ", "cada", " ", "iteraci\[OAcute]n", " ", "la", " ", "longitud", " ", "del", " ", "intervalo", " ", "se", " ", "divide", " ", "por", " ", "2"}], ",", " ", \(el\ n\[UAcute]mero\ de\ iteraciones\ necesarias\ \ ser\[AAcute]\ el\ m\[AAcute]s\ peque\[NTilde]o\ n\[UAcute]mero\ natural\ n\ \ tal\ que\ \((b - a)\)/2\^n < error\), ",", " ", RowBox[{ "donde", " ", "a", " ", "y", " ", "b", " ", "son", " ", "los", " ", StyleBox["extremos", FontSlant->"Italic"], StyleBox[" ", FontSlant->"Italic"], StyleBox["iniciales", FontSlant->"Italic"], " ", "del", " ", \(intervalo . \ Por\), " ", "tanto"}], ",", " ", \(imponiendo\ la\ condici\[OAcute]n\ indicada\ en\ rojo\ y\ en\ \ cursiva\ como\ control\ nunca\ podremos\ entrar\ en\ un\ "\"\)}], " ", "*)"}], "\[IndentingNewLine]", "\[IndentingNewLine]", RowBox[{\(For[i = 1, b - a \[GreaterEqual] \ error, i = i + 1, c = \((a + b)\)/2; \[IndentingNewLine]If[f[c] f[a] < 0, b = c, a = c]\[IndentingNewLine]];\), "\[IndentingNewLine]", \(Print["\", c, "\< con error < \>", b - a, "\<\ncalculada en \>", i - 1, "\< pasos.\>"]\), "\[IndentingNewLine]", "\[IndentingNewLine]", RowBox[{"(*", " ", RowBox[{ "hay", " ", "que", " ", "poner", " ", "\"\\"", " ", "porque", " ", "el", " ", "valor", " ", "de", " ", "i", " ", StyleBox["fuera", FontSlant->"Italic"], " ", "del", " ", "bucle", " ", "est\[AAcute]", " ", "incrementado", " ", "en", " ", "una", " ", "unidad", " ", "respecto", " ", "al", " ", "valor", " ", "de", " ", "i", " ", "en", " ", "la", " ", "\[UAcute]ltima", " ", \(iteraci\[OAcute]n . \ Pongo\), " ", "la", " ", "orden", " ", \(Print[]\), " ", "fuera", " ", "del", " ", "bucle", " ", "porque", " ", "creo", " ", "que", " ", "no", " ", "tiene", " ", "ning\[UAcute]n", " ", "inter\[EAcute]s", " ", "imprimir", " ", "el", " ", "resultado", " ", "de", " ", "cada", " ", \(iteraci\[OAcute]n . \ Eso\), " ", "solamente", " ", "sirve", " ", "para", " ", "llenar", " ", "la", " ", "pantalla", " ", "de", " ", "texto", " ", "cuando", " ", "lo", " ", "\[UAcute]nico", " ", "que", " ", "interesa", " ", "es", " ", "el", " ", "resultado", " ", "final"}], " ", "*)"}], " "}]}]], "Input"], Cell[BoxData[{ \(\(a = N[0];\)\), "\[IndentingNewLine]", \(\(b = N[1];\)\), "\[IndentingNewLine]", \(\(error = N[10^\(-4\)];\)\), "\[IndentingNewLine]", \(\(f[x_] = 2 x - Sin[x] - Exp[\(-x\)];\)\), "\[IndentingNewLine]", \(\(For[i = 1, b - a \[GreaterEqual] \ error, i = i + 1, c = \((a + b)\)/2; \[IndentingNewLine]If[f[c] f[a] < 0, b = c, a = c]];\)\), "\[IndentingNewLine]", \(Print["\", c, "\< con error < \>", b - a, "\<\ncalculada en \>", i - 1, "\< pasos.\>"]\)}], "Input"], Cell[BoxData[{ \(\(a = N[1.55];\)\), "\[IndentingNewLine]", \(\(b = N[2.55];\)\), "\[IndentingNewLine]", \(\(error = N[10^\(-4\)];\)\), "\[IndentingNewLine]", \(\(f[x_] = x\^6 - 3 x\^5 + 2 x\^3 + 3 x\^2 - x - 1;\)\), "\[IndentingNewLine]", \(\(For[i = 1, b - a \[GreaterEqual] \ error, i = i + 1, c = \((a + b)\)/2; \[IndentingNewLine]If[f[c] f[a] < 0, b = c, a = c]];\)\), "\[IndentingNewLine]", \(Print["\", c, "\< con error < \>", b - a, "\<\ncalculada en \>", i - 1, "\< pasos.\>"]\)}], "Input"], Cell[TextData[{ "Es inmediato convertir este programa b\[AAcute]sico en un comando t\ \[IAcute]pico de ", StyleBox["Mathematica", FontSlant->"Italic"], ". Al hacerlo, conviene a\[NTilde]adir una peque\[NTilde]a mejora para \ controlar si es posible aplicar el m\[EAcute]todo de bisecci\[OAcute]n en el \ intervalo elegido." }], "Text"], Cell[BoxData[ \(biseccion[f_, xmin_, xmax_, cotadeerror_] := Module[{a = N[xmin], b = N[xmax], error = N[cotadeerror]}, \[IndentingNewLine]If[ f[a]*f[b] < 0, \[IndentingNewLine]For[i = 1, b - a \[GreaterEqual] \ error, i = i + 1, c = \((a + b)\)/2; \[IndentingNewLine]If[f[c] f[a] < 0, b = c, a = c]]; \[IndentingNewLine]Print["\", c, "\< con error < \>", b - a, "\<\ncalculada en \>", i - 1, "\< pasos.\>"], Print["\"]]\[IndentingNewLine]]\)], "Input"], Cell[BoxData[{ \(Clear[f]\), "\[IndentingNewLine]", \(\(f[x_] = 2 x - Sin[x] - Exp[\(-x\)];\)\), "\[IndentingNewLine]", \(\(g[x_] = x\^6 - 3 x\^5 + 2 x\^3 + 3 x\^2 - x - 1;\)\), "\[IndentingNewLine]", \(biseccion[f, 0, 1, 10^\(-4\)]\), "\[IndentingNewLine]", \(biseccion[g, 1.55, 2.55, 10^\(-4\)]\), "\[IndentingNewLine]", \(biseccion[f, 1, 2, 10^\(-4\)]\)}], "Input"], Cell[TextData[{ "Es frecuente a\[NTilde]adir a este programa b\[AAcute]sico algo que no me \ convence mucho. A saber, la condici\[OAcute]n If[f[c]==0, Print[\"Soluci\ \[OAcute]n exacta: \",N[c,10],\"calculada en \",i,\"pasos.\"]. Es casi \ imposible que calculemos una ra\[IAcute]z ", StyleBox["exacta", FontSlant->"Italic"], " por el m\[EAcute]todo de bisecci\[OAcute]n pues tendr\[IAcute]a que \ ocurrir que dicha ra\[IAcute]z coincidiera con uno de los puntos de divisi\ \[OAcute]n del intervalo. La palabra \"exacta\" en este contexto s\[OAcute]lo \ puede entenderse como \"exacta dentro de la precisi\[OAcute]n de la aritm\ \[EAcute]tica de punto flotante\" del ordenador que estemos usando. Con este \ discutible a\[NTilde]adido el programa quedar\[IAcute]a como sigue." }], "Text"], Cell[BoxData[ \(biseccion[f_, xmin_, xmax_, cotadeerror_] := Module[{a = N[xmin], b = N[xmax], error = N[cotadeerror]}, \[IndentingNewLine]If[ f[a]*f[b] < 0, \[IndentingNewLine]For[i = 1, b - a \[GreaterEqual] \ error, i = i + 1, c = \((a + b)\)/2; \[IndentingNewLine]If[f[c] \[Equal] 0, Print["\", c, "\< calculada en \>", i, "\< pasos.\>"]; \[IndentingNewLine]Break[]]; \ \[IndentingNewLine]If[f[c] f[a] < 0, b = c, a = c]]; \[IndentingNewLine]If[ f[c] \[NotEqual] 0, Print["\", c, "\< con error < \>", b - a, "\<\ncalculada en \>", i - 1, "\< pasos.\>"]], Print[\ "\"]]\[IndentingNewLine]]\)], "Input"], Cell[TextData[{ "Cosa distinta es que estemos interesados en controlar la magnitud de f[c]. \ En tal caso podemos poner un control del tipo If[Abs[f[c]]"Italic"], " de la cota de error para la ra\[IAcute]z aproximada. Podemos entonces \ interrumpir el bucle cuando se verifique alguno de dichos controles. Observa \ que podr\[IAcute]a ocurrir (por ejemplo, para una funci\[OAcute]n muy plana y \ muy peque\[NTilde]a) que fuera Abs[f[c]]"Italic"], " de una ra\[IAcute]z ", StyleBox["exacta", FontSlant->"Italic"], ". La condici\[OAcute]n Abs[f[c]]"Italic"], " aquella para la cual el valor de f[c] es tan peque\[NTilde]o que 1.0+ \ f[c] no puede distinguirse de 1.0. Esto ocurre cuando \ Abs[f[c]]<$MachineEpsilon (recuerda la primera pr\[AAcute]ctica).\nA partir \ de aqu\[IAcute] pueden hacerse much\[IAcute]simas mejoras al programa b\ \[AAcute]sico: controlar la precisi\[OAcute]n en los c\[AAcute]lculos \ internos, incluir como variable un n\[UAcute]mero m\[AAcute]ximo de \ iteraciones introducido por el usuario, proporcionar como salida \ representaciones gr\[AAcute]ficas, cambiar de intervalo si el que se \ introduce no est\[AAcute] en condiciones de aplicar el m\[EAcute]todo de \ bisecci\[OAcute]n, y otras muchas que pueden ocurr\[IAcute]rsete a ti mismo \ si lo piensas un poco. Quiz\[AAcute]s pueda serte \[UAcute]til estudiar el \ siguiente programa que he hecho. Posiblemente a ti se te ocurran mejoras y \ simplificaciones que yo no he sabido ver." }], "Text"], Cell[BoxData[{ \(Off[General::spell1]\), "\[IndentingNewLine]", \(Biseccion[func_, u_, v_, error_, digitos_: 16, maxiter_: Infinity] := Module[{f, maxpasos, a, b, ll, m, M, prec = digitos, delta = error, pasitos = maxiter, c, a2, b2, c2, a1, b1, a0, b0, k, resp}, \[IndentingNewLine]Set @@ {f[x_], func}; (*\ esto\ hace\ que\ el\ programa\ funcione\ tanto\ si\ se\ pone\ la\ \ funci\[OAcute]n\ en\ la\ forma\ "\"\ o\ simplemente\ "\"\ \ *) \[IndentingNewLine]a = N[Rationalize[u], prec]; (*\ Rationalize[]\ permite\ controlar\ de\ forma\ precisa\ la\ \ introducci\[OAcute]n\ de\ los\ datos\ *) \[IndentingNewLine]b = N[Rationalize[v], prec]; \[IndentingNewLine]maxpasos = Ceiling[N[ Log[2, \((b - a)\)/delta]]]; \[IndentingNewLine]maxpasos = Min[maxpasos, pasitos]; \[IndentingNewLine]If[\[IndentingNewLine]f[a]*f[b] > 0, \[IndentingNewLine]m = Min[f[Range[a, b, \((b - a)\)/50]]]; M = Max[f[Range[a, b, \((b - a)\)/50]]]; If[\[IndentingNewLine]m*M > 0, \[IndentingNewLine]Print["\", \ f[x], \ "\< no tenga ra\[IAcute]ces en el intervalo [\>", u, "\<,\>", v, "\<].\>"]; Plot[f[x], {x, a, b}, PlotRange \[Rule] {{Min[a, b, 0], Max[a, b, 0]}, {m - .5, M + .5}}, AxesOrigin \[Rule] {0, 0}, PlotLabel \[Rule] "\" <> ToString[f[x]] <> "\<\n en el intervalo [\>" <> ToString[N[a, 2]] <> "\<, \>" <> ToString[N[b, 2]] <> "\<].\>"\ ]; Return[]\ , \[IndentingNewLine]ll = Table[{a + \((k - 1)\) \((b - a)\)/100, a + k*\((b - a)\)/100}, {k, 1, 100}]; \[IndentingNewLine]{a0, b0} = First[Select[ll, \((f[#[\([1]\)]]*f[#[\([2]\)]] < 0)\) &]]; Pause[ .5]; Plot[f[x], {x, a, b}, PlotRange \[Rule] {{Min[a, b, 0], Max[a, b, 0]}, {m - .5, M + .5}}, AxesOrigin \[Rule] {0, 0}, PlotLabel \[Rule] "\" <> ToString[f[x]] <> "\<\n en el intervalo [\>" <> ToString[N[a, 2]] <> "\<, \>" <> ToString[N[b, 2]] <> "\<].\>"\ ]; Print["\", u, "\<,\>", v, "\<] por [\>", N[a0], "\<,\>", N[b0], "\<].\>"]]\[IndentingNewLine]]; \[IndentingNewLine]Which[ f[a]*f[b] < 0, a1 = a; b1 = b, f[a]*f[b] > 0 && m*M < 0, a1 = a0; b1 = b0]; \[IndentingNewLine]For[\[IndentingNewLine]k = 1, k \[LessEqual] \ maxpasos, \(k++\), \ \n\t\t\ c = \(a1 + b1\)\/2; \ \ \n\t\tIf[\ \[IndentingNewLine]Abs[f[c]] < $MachineEpsilon, Print["\", NumberForm[c, prec], \ "\<\ncalculada en \>", \ k, "\< iteraciones\>"]; \[IndentingNewLine]Return[ NumberForm[c, prec]]\[IndentingNewLine]\t\t]; \n\t\tIf[ Sign[f[a1]] \[NotEqual] Sign[f[c]], b1 = c, a1 = c]; \n\t\tIf[\[IndentingNewLine]b1 - a1 \[LessEqual] \ N[Rationalize[delta], prec], Print["\", NumberForm[c, prec]]; \[IndentingNewLine]Print["\", k]; \n\t Print["\", N[delta]]; \[IndentingNewLine]Return[ NumberForm[c, prec]]\[IndentingNewLine]\t\t]; \[IndentingNewLine]If[\ \[IndentingNewLine]k + 1 > maxpasos, Print["\", maxpasos, "\<\nsin encontrar una soluci\[OAcute]n dentro de la \ cota de error permitida.\>"]; \[IndentingNewLine]Print[\ "\", \ NumberForm[c, prec], \ "\<\nEl error m\[AAcute]ximo cometido es \>", b1 - a1]; \[IndentingNewLine]Pause[ .3]; \ \[IndentingNewLine]resp = Input["\<\[DownQuestion]Quieres una aproximaci\[OAcute]n mejor? \ Responde: S (si) o N (no)\>"]; If[resp == S, \[IndentingNewLine]Pause[ .5]; Plot[f[x], {x, a, b}, PlotRange \[Rule] {{Min[a, b, 0], Max[a, b, 0]}, All}, AxesOrigin \[Rule] {0, 0}]; Pause[ .5]; a2 = Input["\"]; Pause[ .5]; b2 = Input["\"]; \ \[IndentingNewLine]Biseccion[f[x], a2, b2, delta, prec, Infinity]]; If[resp \[Equal] N, Return[NumberForm[c, prec]\[IndentingNewLine]\t]\[IndentingNewLine]\t]\ \[IndentingNewLine]\t]\[IndentingNewLine]\t]\[IndentingNewLine]\t]\), "\ \[IndentingNewLine]", \(On[General::spell1]\)}], "Input"], Cell["\<\ Puedes comprobar el funcionamiento de este programa con los ejemplos que \ siguen.\ \>", "Text"], Cell[BoxData[ \(f[x_] := x*Sin[x] - 1\)], "Input"], Cell[BoxData[ \(\(Plot[f[x], {x, \(-7.5\), 7.5}];\)\)], "Input"], Cell[BoxData[ \(\(\(Biseccion[f[x], 0, 2, 10^\(-18\), 18]\)\(//\)\(Timing\)\(\ \)\)\)], "Input"], Cell[BoxData[ \(Biseccion[f[x], 3, 7, 10^\(-16\), 18]\)], "Input"], Cell[BoxData[ \(Biseccion[f[x], 3, 7, 10^\(-16\), 20]\)], "Input"], Cell[BoxData[ \(Biseccion[f[x], 3, 7, 10^\(-16\), 18, 51]\)], "Input"], Cell[BoxData[ \(Biseccion[f[x], 3, 7, 10^\(-16\), 18, 51]\)], "Input"], Cell[BoxData[ \(Biseccion[f[x], 3, 6, 10^\(-10\), 18]\)], "Input"], Cell[BoxData[ \(Biseccion[f[x], 0, 3, 10^\(-20\), 20]\)], "Input"] }, Open ]] }, Open ]], Cell[CellGroupData[{ Cell["Ejercicio 2", "Section"], Cell[TextData[{ "Define un comando que calcule sumas de Riemann de una funci\[OAcute]n f en \ un intervalo [a,b]. Dicho comando debe dividir el intervalo [a,b] en n partes \ iguales, evaluar la funci\[OAcute]n f en el punto medio de cada uno de los \ subintervalos que resultan, sumar todos los valores as\[IAcute] obtenidos de \ f y multiplicar por la longitud de los subintervalos. Define este comando de \ manera que trabaje num\[EAcute]ricamente.\nAplica a las siguientes funciones \ el comando que has escrito y compara los valores obtenidos con los que \ proporciona el comando \"NIntegrate[ ]\" con las opciones, \ WorkingPrecision->30, MaxRecursion->30. Debes\nconseguir que la diferencia \ entre ambos resultados sea menor que ", Cell[BoxData[ \(TraditionalForm\`10\^\(-2\)\)]], ". En cada caso indica el n\[UAcute]mero de partes en que divides el \ intervalo para lograr lo que se pide.\na) ", Cell[BoxData[ \(TraditionalForm\`f(x) = cos(1/x)\)]], " en el intervalo [0.01,1].\nb) ", Cell[BoxData[ FormBox[ RowBox[{\(g(x)\), "=", RowBox[{"x", " ", FormBox[\(sen(e\^x)\), "TraditionalForm"]}]}], TraditionalForm]]], " en el intervalo [0,6]." }], "Text"], Cell[CellGroupData[{ Cell["Soluci\[OAcute]n", "Subsection"], Cell[TextData[{ "Este ejercicio est\[AAcute] propuesto, casi con las mismas palabras, en la \ pr\[AAcute]ctica 6 donde se dan tambi\[EAcute]n algunas sugerencias para \ hacerlo. El ejercicio es tan f\[AAcute]cil que lo que me extra\[NTilde]a es \ que no lo hay\[AAcute]is hecho bien todos. Adem\[AAcute]s, al igual que el \ ejercicio 1, puede hacerse sin necesidad de saber mucho de ", StyleBox["Mathematica", FontSlant->"Italic"], ". Un elemental proceso iterativo es todo lo que se necesita." }], "Text"], Cell[BoxData[ \(\(\( (*\ programa\ b\[AAcute]sico\ *) \)\(\[IndentingNewLine]\)\( (*\ a = N[aqu\[IAcute]\ va\ el\ extremo\ inferior\ del\ intervalo]\ *) \)\(\ \[IndentingNewLine]\)\( (*\ naturalmente, \ pongo\ N[]\ para\ asgurarme\ de\ que\ el\ programa\ trabajar\[AAcute]\ \ num\[EAcute]ricamente\ *) \)\(\[IndentingNewLine]\)\( (*\ b = N[aqu\[IAcute]\ va\ el\ extremo\ superior\ del\ intervalo]\ *) \)\(\ \[IndentingNewLine]\)\( (*\ n = \ n\[UAcute]mero\ de\ divisiones\ *) \)\(\[IndentingNewLine]\)\( \ (*\ f[x_] = \ aqu\[IAcute]\ va\ la\ funci\[OAcute]n\ *) \)\(\[IndentingNewLine]\)\(\ \(SumaRiemann = Module[{suma = 0, k = 0, inc = N[\((b - a)\)/n]}, \[IndentingNewLine]Do[ suma = suma + f[a + 0.5*inc + k*inc], {k, 0, n - 1}]; \[IndentingNewLine]suma = suma*inc]\)\(\[IndentingNewLine]\) \( (*\ observa\ que\ debemos\ pararnos\ en\ n - 1\ para\ no\ salirnos\ fuera\ del\ intervalo\ *) \)\)\)\)], "Input"], Cell[BoxData[{ \(\(a = N[0.01];\)\), "\[IndentingNewLine]", \(\(b = N[1];\)\), "\[IndentingNewLine]", \(\(n = 1000;\)\ (*\ la\ funci\[OAcute]n\ oscila\ mucho, \ por\ lo\ que\ hay\ que\ hay\ que\ hacer\ una\ partici\[OAcute]n\ del\ \ intervalo\ con\ muchos\ puntos\ para\ lograr\ la\ aproximaci\[OAcute]n\ que\ \ piden . \ Parece\ razonable\ probar, \ en\ principio, \ con\ 1000\ *) \), "\[IndentingNewLine]", \(\(f[x_] = Cos[1/x];\)\), "\[IndentingNewLine]", \(Module[{suma = 0.0, k = 0, inc = N[\((b - a)\)/n]}, \[IndentingNewLine]Do[ suma = suma + f[a + 0.5*inc + k*inc], {k, 0, n - 1}]; \[IndentingNewLine]suma = suma*inc]\)}], "Input"], Cell[BoxData[ \(NIntegrate[Cos[1/x], {x, 0.01, 1}, WorkingPrecision \[Rule] 30, MaxRecursion \[Rule] 30]\)], "Input"], Cell[BoxData[{ \(Abs[% - %%] < \(\(10^\(-2\)\)\(\ \)\)\), "\[IndentingNewLine]", \( (*\ comprobamos\ que\ el\ resultado\ verifica\ la\ condici\[OAcute]n\ del\ \ enunciado\ *) \)}], "Input"], Cell[BoxData[{ \(\(a = N[0];\)\), "\[IndentingNewLine]", \(\(b = N[6];\)\), "\[IndentingNewLine]", \(n = 1000; \ (*\ la\ funci\[OAcute]n\ oscila\ mucho, \ por\ lo\ que\ hay\ que\ hay\ que\ hacer\ una\ partici\[OAcute]n\ del\ \ intervalo\ con\ muchos\ puntos\ para\ lograr\ la\ aproximaci\[OAcute]n\ que\ \ piden . \ Parece\ razonable\ probar, \ en\ principio, \ con\ 1000\ *) \[IndentingNewLine]f[x_] = x*Sin[Exp[x]];\), "\[IndentingNewLine]", \(Module[{suma = 0.0, k = 0, inc = N[\((b - a)\)/n]}, \[IndentingNewLine]Do[ suma = suma + f[a + 0.5*inc + k*inc], {k, 0, n - 1}]; \[IndentingNewLine]suma = suma*inc]\)}], "Input"], Cell[BoxData[ \(NIntegrate[x*Sin[Exp[x]], {x, 0, 6}, WorkingPrecision \[Rule] 30, MaxRecursion \[Rule] 30]\)], "Input"], Cell[BoxData[{ \(Abs[% - %%] < \(\(10^\(-2\)\)\(\ \)\)\), "\[IndentingNewLine]", \( (*\ comprobamos\ que\ el\ resultado\ verifica\ la\ condici\[OAcute]n\ del\ \ enunciado\ *) \)}], "Input"], Cell["\<\ Es inmediato convertir en un comando el programita anterior. La \[UAcute]nica \ precauci\[OAcute]n que hay que tomar es no introducir en un proceso iterativo \ un par\[AAcute]metro formal (como ya sabes de la pr\[AAcute]ctica 4).\ \>", "Text"], Cell[BoxData[ \(SumaRiemann[func_, xmin_, xmax_, n_] := Module[{suma = 0.0, k = 0, a = N[xmin], b = N[xmax], p = n}, inc = N[\((b - a)\)/p]; \[IndentingNewLine]Do[ suma = suma + func[a + 0.5*inc + k*inc], {k, 0, p - 1}]; \[IndentingNewLine]suma = suma*inc]\)], "Input"], Cell[BoxData[{ \(\(f[x_] = Cos[1/x];\)\), "\[IndentingNewLine]", \(SumaRiemann[f, 0.01, 1, 1000]\)}], "Input"], Cell[BoxData[{ \(\(g[x_] = x*Sin[Exp[x]];\)\), "\[IndentingNewLine]", \(SumaRiemann[g, 0, 6, 1000]\)}], "Input"], Cell[TextData[{ "Si usas el comando de ", StyleBox["Mathematica", FontSlant->"Italic"], " Sum[ ] puedes ahorrarte trabajo." }], "Text"], Cell[BoxData[ StyleBox[\(\(nueva sumariemann\)[func_, a_, b_, n_] := \(\(Sum[ func[a + 0.5*inc + k*N[\((b - a)\)/n]], {k, 0, n - 1}]\)\(*\)\(N[\((b - a)\)/n]\)\(\ \)\)\), FontFamily->"Courier New"]], "Input", FontFamily->"Trebuchet MS"], Cell[BoxData[{ RowBox[{ StyleBox[ RowBox[{"nueva", StyleBox["sumariemann", FontFamily->"Courier New"]}]], "[", \(g, 0, 6, 1000\), "]"}], "\[IndentingNewLine]", RowBox[{ StyleBox[ RowBox[{"nueva", StyleBox["sumariemann", FontFamily->"Courier New"]}]], "[", \(f, 0.01, 1, 1000\), "]"}]}], "Input"] }, Open ]] }, Open ]], Cell[CellGroupData[{ Cell["Criterios de calificaci\[OAcute]n", "Section"], Cell[TextData[{ "Para calificar he seguido los criterios que se dieron por escrito (aqu\ \[IAcute] no hay sorpresas). Primero: los programas b\[AAcute]sicos y que \ funcionen. Quien los haya hecho correctamente est\[AAcute] aprobado. Cuando \ en dichos programas se ha introducido alguna mejora o se han convertido en \ comandos de ", StyleBox["Mathematica", FontSlant->"Italic"], " la calificaci\[OAcute]n ha sido de notable o, en algunos pocos casos, de \ sobresaliente. He quitado puntos a quienes han cometido fallos imperdonables \ de sintaxis en la definic\[OAcute]n de las funciones, como escribir \"senx\" \ en vez de Sin[x] y cosas as\[IAcute]. Tambi\[EAcute]n he quitado puntos a \ quienes han definido comandos que no se eval\[UAcute]an num\[EAcute]ricamente \ y no han tenido la honradez de advertirlo. Me parece una falta grave entregar \ un examen de pr\[AAcute]cticas sabiendo que los comandos definidos no \ funcionan correctamente (porque eso se sabe) y no informar de ello a quien \ debe calificarlo. " }], "Text"] }, Open ]] }, FrontEndVersion->"Microsoft Windows 3.0", ScreenRectangle->{{0, 1024}, {0, 703}}, WindowSize->{999, 634}, WindowMargins->{{0, Automatic}, {Automatic, 5}}, Magnification->1.25, StyleDefinitions -> "Classroom.nb" ] (*********************************************************************** Cached data follows. If you edit this Notebook file directly, not using Mathematica, you must remove the line containing CacheID at the top of the file. The cache data will then be recreated when you save this file from within Mathematica. ***********************************************************************) (*CellTagsOutline CellTagsIndex->{} *) (*CellTagsIndex CellTagsIndex->{} *) (*NotebookFileOutline Notebook[{ Cell[1709, 49, 208, 4, 167, "Title"], Cell[1920, 55, 148, 4, 87, "Author"], Cell[CellGroupData[{ Cell[2093, 63, 30, 0, 69, "Section"], Cell[2126, 65, 1168, 27, 174, "Text"], Cell[CellGroupData[{ Cell[3319, 96, 38, 0, 56, "Subsection"], Cell[3360, 98, 1224, 26, 117, "Text"], Cell[4587, 126, 6406, 138, 543, "Input"], Cell[10996, 266, 570, 9, 396, "Input"], Cell[11569, 277, 610, 11, 397, "Input"], Cell[12182, 290, 345, 8, 54, "Text"], Cell[12530, 300, 671, 11, 186, "Input"], Cell[13204, 313, 421, 8, 376, "Input"], Cell[13628, 323, 798, 13, 96, "Text"], Cell[14429, 338, 908, 15, 249, "Input"], Cell[15340, 355, 2068, 35, 255, "Text"], Cell[17411, 392, 5293, 92, 1435, "Input"], Cell[22707, 486, 106, 3, 33, "Text"], Cell[22816, 491, 54, 1, 60, "Input"], Cell[22873, 494, 68, 1, 60, "Input"], Cell[22944, 497, 109, 2, 60, "Input"], Cell[23056, 501, 70, 1, 60, "Input"], Cell[23129, 504, 70, 1, 60, "Input"], Cell[23202, 507, 74, 1, 60, "Input"], Cell[23279, 510, 74, 1, 60, "Input"], Cell[23356, 513, 70, 1, 60, "Input"], Cell[23429, 516, 70, 1, 60, "Input"] }, Open ]] }, Open ]], Cell[CellGroupData[{ Cell[23548, 523, 30, 0, 69, "Section"], Cell[23581, 525, 1241, 25, 249, "Text"], Cell[CellGroupData[{ Cell[24847, 554, 38, 0, 56, "Subsection"], Cell[24888, 556, 517, 9, 75, "Text"], Cell[25408, 567, 1006, 17, 249, "Input"], Cell[26417, 586, 706, 12, 396, "Input"], Cell[27126, 600, 128, 2, 60, "Input"], Cell[27257, 604, 205, 4, 81, "Input"], Cell[27465, 610, 693, 12, 255, "Input"], Cell[28161, 624, 130, 2, 81, "Input"], Cell[28294, 628, 205, 4, 81, "Input"], Cell[28502, 634, 253, 4, 55, "Text"], Cell[28758, 640, 312, 5, 125, "Input"], Cell[29073, 647, 119, 2, 81, "Input"], Cell[29195, 651, 121, 2, 81, "Input"], Cell[29319, 655, 145, 5, 34, "Text"], Cell[29467, 662, 287, 6, 81, "Input"], Cell[29757, 670, 392, 12, 81, "Input"] }, Open ]] }, Open ]], Cell[CellGroupData[{ Cell[30198, 688, 52, 0, 77, "Section"], Cell[30253, 690, 1043, 17, 164, "Text"] }, Open ]] } ] *) (*********************************************************************** End of Mathematica Notebook file. ***********************************************************************)