<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="es">
		<id>https://mat.caminos.upm.es/w/index.php?feed=atom&amp;namespace=0&amp;title=Especial%3AP%C3%A1ginasNuevas</id>
		<title>MateWiki - Páginas nuevas [es]</title>
		<link rel="self" type="application/atom+xml" href="https://mat.caminos.upm.es/w/index.php?feed=atom&amp;namespace=0&amp;title=Especial%3AP%C3%A1ginasNuevas"/>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/wiki/Especial:P%C3%A1ginasNuevas"/>
		<updated>2026-05-06T15:57:36Z</updated>
		<subtitle>De MateWiki</subtitle>
		<generator>MediaWiki 1.26.2</generator>

	<entry>
		<id>https://mat.caminos.upm.es/wiki/An%C3%A1lisis_Urban%C3%ADstico_Multicriterio_del_Precio_del_Alquiler_de_la_Ciudad_de_Madrid</id>
		<title>Análisis Urbanístico Multicriterio del Precio del Alquiler de la Ciudad de Madrid</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/wiki/An%C3%A1lisis_Urban%C3%ADstico_Multicriterio_del_Precio_del_Alquiler_de_la_Ciudad_de_Madrid"/>
				<updated>2026-05-05T16:29:07Z</updated>
		
		<summary type="html">&lt;p&gt;Roddyk: /* Cobertura de transporte público */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ TrabajoSIG | Análisis Urbanístico Multicriterio del Precio del Alquiler de la Ciudad de Madrid| Juan Casteres Cortiñas&amp;lt;br/&amp;gt; Roddyk Arven Inocencio Bahía&amp;lt;br/&amp;gt; Mario González| [[:Categoría:SIGAIC_25/26|Curso 25/26]] }}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Usa todo el código de abajo para tener la estructura inicial del artículo.&lt;br /&gt;
&lt;br /&gt;
Resumen máximo 300 palabras&lt;br /&gt;
&lt;br /&gt;
= Introducción =&lt;br /&gt;
En el siguiente trabajo se presenta un análisis de la correlación entre diferentes criterios urbanísticos y su influencia en el precio del alquiler de las viviendas en la Ciudad de Madrid.&lt;br /&gt;
Para ello&lt;br /&gt;
&lt;br /&gt;
= Metodología =&lt;br /&gt;
== Variación de parámetros poblacionales ==&lt;br /&gt;
== Cobertura de transporte público ==&lt;br /&gt;
El transporte público y su infraestructura son uno de los principales motores de revalorización del suelo, influyendo directamente en los precios del alquiler de las viviendas. Se ha analizado la cobertura de las estaciones de Metro, Cercanías y Metro Ligero, con el objeto de determinar el grado de conexión de los distintos barrios con la red de transporte público.&lt;br /&gt;
&lt;br /&gt;
En primer lugar, se han realizado buffers alrededor de las estaciones para obtener sus áreas de influencias. Considerando la relevancia y la capacidad de cada modo de transporte en la ciudad, se han asignado las siguientes distancias de buffer: 800 metros para Cercanías, 500 metros para Metro y 300 metros para Metro Ligero. Estas tres capas se disuelven en una sola capa para obtener el área de influencia total del transporte público en el municipio de Madrid.&lt;br /&gt;
&lt;br /&gt;
A continuación, se quiere calcular la proporción de área cubierta por el transporte público en cada barrio. No obstante, se debe considerar que parte de la superficie de cada barrio no está ocupada por suelo urbano (por ejemplo, zonas verdes, industrias, equipamiento de servicios...). Por lo tanto, se ha utilizado la capa de usos de suelo de SIOSE de 2014, filtrando únicamente las capas correspondientes a las clases denominadas &amp;quot;Casco&amp;quot;, &amp;quot;Ensance&amp;quot; y &amp;quot;Discontinua&amp;quot;. Una vez obtenida la capa de usos de suelo urbano de la Ciudad de Madrid, se realiza su intersección con la capa de barrios para conseguir la superficie de suelo urbano en cada barrio.&lt;br /&gt;
&lt;br /&gt;
Finalmente, se realiza la intersección de la capa de buffers de transporte público con la capa de suelos urbanos, y mediante el área de dicha intersección por barrio, se calcula el porcentaje de área cubierta por las estaciones de transporte en cada barrio.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Cobertura de transporte público.jpg]]&lt;br /&gt;
&lt;br /&gt;
==Análisis de la presión turística==&lt;br /&gt;
&lt;br /&gt;
= Resultados =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Conclusiones =&lt;br /&gt;
&lt;br /&gt;
= Referencias =&lt;br /&gt;
&lt;br /&gt;
= Anejo =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Categoría:Sistemas de Información Geográfica Aplicados a la Ingeniería Civil]]&lt;br /&gt;
[[Categoría:SIGAIC_25/26]]&lt;/div&gt;</summary>
		<author><name>Juan Casteres</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/wiki/Distribuci%C3%B3n_y_Accesibilidad_de_Zonas_Verdes_en_Segovia_Capitalia</id>
		<title>Distribución y Accesibilidad de Zonas Verdes en Segovia Capitalia</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/wiki/Distribuci%C3%B3n_y_Accesibilidad_de_Zonas_Verdes_en_Segovia_Capitalia"/>
				<updated>2026-05-05T16:03:26Z</updated>
		
		<summary type="html">&lt;p&gt;Andrea.amo: /* Mapa de buffers e intersección entre carreteras y zonas verdes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ TrabajoSIG | Distribución y Accesibilidad de Zonas Verdes en Segovia Capital | Ángela Clarambo, Andrea Amo, Nicolas Martin y Alvaro Roman | [[:Categoría:SIGAIC_25/26|Curso 25/26]] }}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
El proyecto tiene como objetivo analizar la distribución y la accesibilidad de las zonas verdes en Segovia capital, evaluando su adecuación según criterios de proximidad, conectividad, transporte público y equidad territorial. Tal como se indica en el documento original, el estudio busca “analizar la distribución espacial y la accesibilidad a las zonas verdes urbanas en Segovia capital, evaluando su adecuación respecto a criterios de proximidad, conectividad y equidad territorial”.&lt;br /&gt;
&lt;br /&gt;
La metodología combina cartografía oficial, ortofotografías recientes y datos demográficos con un análisis detallado de la movilidad urbana. Se delimitarán y clasificarán las zonas verdes existentes, y se estudiará cómo se accede a ellas desde los distintos barrios teniendo en cuenta la red viaria, la velocidad de las calles, los tiempos de desplazamiento reales y la cobertura del transporte público (líneas, paradas y frecuencia). Esto permitirá valorar no solo la distancia física, sino la accesibilidad efectiva.&lt;br /&gt;
&lt;br /&gt;
El análisis se cruzará con la distribución de la población por secciones censales para identificar desigualdades territoriales: barrios con buena oferta y conectividad frente a zonas donde el acceso es limitado por distancia, mala conexión viaria o falta de transporte.&lt;br /&gt;
&lt;br /&gt;
Además, el trabajo incluye una parte propositiva. Se plantearán nuevas localizaciones potenciales para zonas verdes en áreas deficitarias, así como mejoras en la red de accesos o en la organización de algunos espacios existentes. También se valorará si hay zonas verdes sobredimensionadas o mal ubicadas que podrían reordenarse para mejorar la equidad territorial.&lt;br /&gt;
&lt;br /&gt;
En conjunto, el estudio ofrece una visión integral de cómo se distribuyen y cómo se accede a las zonas verdes en Segovia, proporcionando una base útil para la planificación urbana sostenible.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center&amp;quot;&amp;gt;&lt;br /&gt;
[[Archivo:Alcazar234.jpeg|600px]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
== Introducción: Ubicación y Descripción ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:right; width:320px; margin-left:20px;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-bottom:15px;&amp;quot;&amp;gt;&lt;br /&gt;
[[File:SegoProvinca.jpeg|250px]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
[[File:segoviacap.jpeg|250px]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Segovia es una ciudad de tamaño medio situada en el centro de la península ibérica, caracterizada por una estructura urbana compacta, un casco histórico muy consolidado y una serie de barrios periféricos que se han desarrollado principalmente a partir de la segunda mitad del siglo XX. Su topografía, marcada por lomas, vaguadas y la presencia de los valles del Eresma y el Clamores, condiciona tanto la forma de crecimiento urbano como la distribución de los espacios libres.&lt;br /&gt;
&lt;br /&gt;
La ciudad combina áreas densas y tradicionales (como el casco histórico, San Millán o El Salvador) con barrios más recientes como Nueva Segovia, La Albuera o El Cristo del Mercado, donde la planificación urbana ha incorporado espacios verdes de forma más sistemática. Sin embargo, esta distribución no siempre garantiza una accesibilidad homogénea, ya que la conectividad viaria, la jerarquía de calles, las velocidades permitidas y la disponibilidad de transporte público influyen directamente en cómo se relacionan los habitantes con estos espacios.&lt;br /&gt;
&lt;br /&gt;
Segovia presenta además una red de transporte urbano relativamente sencilla, articulada en torno a unas pocas líneas que conectan los barrios con el centro. Esta estructura, junto con la morfología urbana y la presencia de barreras físicas como desniveles o vías de tráfico rápido, hace especialmente relevante estudiar cómo se accede realmente a los parques y jardines de la ciudad.&lt;br /&gt;
&lt;br /&gt;
En este contexto, analizar las zonas verdes no solo implica identificar dónde están, sino comprender cómo se integran en la vida cotidiana: qué barrios tienen un acceso cómodo, cuáles dependen del autobús, dónde los tiempos de desplazamiento son mayores y qué áreas podrían beneficiarse de nuevos espacios verdes o de mejoras en los existentes.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Metodología y Resultados==&lt;br /&gt;
La metodología seguida en este trabajo se basa en el análisis espacial mediante Sistemas de Información Geográfica (SIG), utilizando el software QGIS como herramienta principal para la gestión, análisis y representación de los datos. El objetivo es estudiar la distribución y accesibilidad de las zonas verdes en Segovia, relacionándolas con la red viaria, la movilidad urbana, el transporte público y la distribución de la población.&lt;br /&gt;
Para ello, se han empleado diferentes fuentes de datos oficiales y colaborativas:&lt;br /&gt;
&lt;br /&gt;
- Datos demográficos: procedentes del Instituto Nacional de Estadística (INE), en concreto las secciones censales del Censo de Población 2021, utilizadas para calcular la densidad de población.&amp;lt;br&amp;gt;&lt;br /&gt;
- Datos cartográficos urbanos: obtenidos principalmente de OpenStreetMap, descargados mediante el complemento QuickOSM de QGIS, incluyendo zonas verdes, red viaria y transporte público.&amp;lt;br&amp;gt;&lt;br /&gt;
- Cartografía de referencia: empleada como base visual para contextualizar los resultados.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Todos los datos han sido reproyectados al sistema ETRS89 / UTM zona 30N (EPSG:25830), adecuado para análisis métricos y cálculos de distancia y superficie en el ámbito de estudio.&lt;br /&gt;
=== Mapa de zonas verdes de Segovia ===&lt;br /&gt;
En primer lugar, se elaboró un mapa de las zonas verdes del municipio de Segovia, que constituye la base del análisis posterior. Este mapa permite identificar la localización, distribución y tipología de los espacios verdes urbanos (parques, jardines, zonas recreativas, etc.).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
El objetivo principal de este mapa es observar:&amp;lt;br&amp;gt;&lt;br /&gt;
- La concentración o dispersión de las zonas verdes.&amp;lt;br&amp;gt;&lt;br /&gt;
- Las diferencias entre el centro urbano y los barrios periféricos.&amp;lt;br&amp;gt;&lt;br /&gt;
- El tamaño y continuidad de los espacios verdes existentes.&amp;lt;br&amp;gt;&lt;br /&gt;
Este mapa sirve como punto de partida para evaluar posteriormente la accesibilidad y la relación con otros elementos urbanos.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center&amp;quot;&amp;gt;&lt;br /&gt;
[[Archivo:Soloverdes.jpeg|600px]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
En el mapa se observa una distribución muy variada de zonas verdes alrededor de la ciudad. Las áreas de bosque, masa forestal y pradera se concentran principalmente en la periferia, formando un cinturón natural que rodea el núcleo urbano. Estas zonas verdes exteriores son amplias y continuas, lo que favorece su función ecológica y recreativa.&lt;br /&gt;
&lt;br /&gt;
Dentro del área urbana aparecen espacios verdes más pequeños, como jardines, césped y parques, distribuidos de manera más fragmentada. Estos espacios cumplen un papel de proximidad, pero no forman una red continua. También se aprecia que varias rutas ciclistas y peatonales atraviesan o bordean zonas verdes, lo que facilita su acceso y las integra en la movilidad cotidiana. En cambio, algunos parques interiores quedan más aislados dentro del tejido urbano, sin conexión directa con las grandes áreas naturales periféricas.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Mapa de buffers e intersección entre carreteras y zonas verdes ===&lt;br /&gt;
A continuación, se realizó un análisis de accesibilidad mediante buffers, generando áreas de influencia alrededor de las zonas verdes. Se consideraron distancias caminables habituales en entornos urbanos, de 75 metros.&lt;br /&gt;
Posteriormente, estos buffers se intersecaron con la red viaria, con el fin de analizar la relación entre las zonas verdes y las infraestructuras de circulación.&lt;br /&gt;
Con este mapa se pretende:&amp;lt;br&amp;gt;&lt;br /&gt;
- Identificar qué zonas del viario quedan cubiertas por la proximidad a zonas verdes.&amp;lt;br&amp;gt;&lt;br /&gt;
- Detectar áreas alejadas de espacios verdes.&amp;lt;br&amp;gt;&lt;br /&gt;
- Evaluar la conectividad potencial entre zonas verdes y calles urbanas.&amp;lt;br&amp;gt;&lt;br /&gt;
Este análisis proporciona una primera aproximación, de carácter teórico, a la accesibilidad peatonal.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center&amp;quot;&amp;gt;&lt;br /&gt;
[[Archivo:Buffersego.jpeg|600px]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
En el mapa se observa cómo las distintas zonas verdes generan áreas de influencia alrededor de la ciudad mediante buffers diferenciados por tipo de vegetación: bosque, masa forestal, pradera, césped, jardín y parque. Estos buffers muestran la extensión real del impacto de cada zona verde sobre el entorno urbano, permitiendo identificar qué áreas quedan más próximas a espacios naturales y cuáles se encuentran más alejadas.&lt;br /&gt;
&lt;br /&gt;
Los buffers más amplios corresponden a las zonas verdes de mayor tamaño, especialmente los bosques y masas forestales situados en la periferia. Estos generan áreas de influencia extensas que rodean gran parte del municipio. En contraste, los jardines y parques urbanos producen buffers más pequeños y fragmentados, reflejando su menor superficie y su carácter más localizado dentro del tejido urbano.&lt;br /&gt;
&lt;br /&gt;
El mapa también muestra claramente las intersecciones entre los buffers y la red de carreteras. En varios puntos, las vías principales atraviesan o bordean zonas de influencia de áreas verdes, lo que indica una relación directa entre movilidad y entorno natural. Estas intersecciones señalan lugares donde la presencia de carreteras puede generar impactos sobre los espacios verdes, pero también zonas donde la accesibilidad a ellos es mayor debido a la proximidad a la red viaria.&lt;br /&gt;
&lt;br /&gt;
En conjunto, el mapa permite identificar qué zonas verdes tienen mayor capacidad de influencia sobre la ciudad, qué áreas urbanas están más expuestas a estos espacios naturales y dónde se producen los puntos de contacto entre carreteras y áreas de valor ambiental.&lt;br /&gt;
&lt;br /&gt;
=== Mapa de transporte público de Segovia ===&lt;br /&gt;
Para complementar el análisis de accesibilidad, se elaboró un mapa del transporte público urbano, incorporando paradas y líneas de autobús obtenidas a partir de OpenStreetMap.&lt;br /&gt;
&lt;br /&gt;
El objetivo de este mapa es analizar:&amp;lt;br&amp;gt;&lt;br /&gt;
- La cobertura del transporte público en relación con las zonas verdes.&amp;lt;br&amp;gt;&lt;br /&gt;
- La facilidad de acceso a los espacios verdes mediante transporte colectivo.&amp;lt;br&amp;gt;&lt;br /&gt;
- La posible dependencia del vehículo privado en determinadas zonas de la ciudad.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Este mapa permite incorporar la movilidad urbana al estudio, más allá del acceso exclusivamente peatonal.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center&amp;quot;&amp;gt;&lt;br /&gt;
[[Archivo:bussego.jpeg|600px]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
En el mapa se observa una red de movilidad compuesta por rutas ciclistas, rutas peatonales, líneas de autobús y una jerarquía clara de vías principales y secundarias. Las rutas peatonales se concentran en el núcleo urbano, lo que indica que el centro es fácilmente accesible a pie. Las rutas ciclistas se extienden hacia zonas más periféricas, conectando barrios y permitiendo acceder a áreas naturales o equipamientos situados fuera del centro.&lt;br /&gt;
&lt;br /&gt;
Las líneas de autobús cubren los ejes principales de la ciudad, aunque no llegan de forma uniforme a todas las zonas periféricas, lo que genera diferencias en accesibilidad según el barrio. También se aprecia la presencia de desniveles y cotas, lo que muestra que la topografía influye en la movilidad: algunas zonas pueden estar cerca en distancia pero ser menos accesibles debido a las pendientes. En conjunto, el mapa evidencia que la accesibilidad depende del modo de transporte y de la localización dentro de la ciudad.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Mapa de velocidades de la red viaria ===&lt;br /&gt;
Posteriormente, se realizó un mapa de velocidades de la red viaria, asignando una velocidad teórica a cada tramo de carretera en función del tipo de vía (highway), de acuerdo con la normativa urbana vigente.&lt;br /&gt;
Este paso fue necesario debido a la ausencia de información explícita de velocidad máxima en gran parte de los datos disponibles.&lt;br /&gt;
&lt;br /&gt;
El mapa permite observar:&amp;lt;br&amp;gt;&lt;br /&gt;
- La jerarquía viaria del municipio.&amp;lt;br&amp;gt;&lt;br /&gt;
- La localización de vías rápidas frente a calles residenciales.&amp;lt;br&amp;gt;&lt;br /&gt;
- La relación entre velocidad, accesibilidad y entorno urbano.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Este análisis es especialmente relevante para interpretar la seguridad y calidad de acceso a las zonas verdes.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center&amp;quot;&amp;gt;&lt;br /&gt;
[[Archivo:Velocisego.jpeg|600px]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Mapa conjunto: zonas verdes, velocidades y transporte público ===&lt;br /&gt;
Una vez elaborados los mapas anteriores, se generó un mapa conjunto que integra zonas verdes, velocidades de la red viaria, transporte público.&amp;lt;br&amp;gt;&lt;br /&gt;
El objetivo de este mapa sintético es ofrecer una visión global del sistema urbano, permitiendo identificar:&amp;lt;br&amp;gt;&lt;br /&gt;
- Zonas bien dotadas desde el punto de vista ambiental y de movilidad.&amp;lt;br&amp;gt;&lt;br /&gt;
- Áreas donde coinciden altas velocidades y escasa accesibilidad.&amp;lt;br&amp;gt;&lt;br /&gt;
- Espacios potencialmente mejorables desde la planificación urbana.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Este mapa facilita la interpretación conjunta de los factores analizados.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center&amp;quot;&amp;gt;&lt;br /&gt;
[[Archivo:Zonasverdessego.jpeg|600px]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
En el mapa se observa una clara diferenciación entre las velocidades permitidas en las distintas vías de la ciudad. El centro urbano aparece dominado por velocidades bajas, principalmente entre 0 y 19 km/h y entre 19 y 29 km/h, lo que indica una zona de tráfico calmado, con calles estrechas y una mayor presencia de movilidad peatonal. Estas áreas de baja velocidad se concentran en el núcleo histórico y en los barrios más consolidados.&lt;br /&gt;
&lt;br /&gt;
A medida que se avanza hacia la periferia, las velocidades aumentan de forma progresiva. Las vías que rodean la ciudad muestran rangos de 49 a 79 km/h, y las carreteras principales y autovías exteriores alcanzan velocidades superiores, entre 79 y 120 km/h. Estas vías rápidas forman un anillo de conexión que facilita los desplazamientos interurbanos, pero también actúan como límites físicos respecto al interior urbano.&lt;br /&gt;
&lt;br /&gt;
El mapa refleja una estructura viaria jerarquizada:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
- Velocidades bajas en el interior urbano, asociadas a calles locales y zonas residenciales.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
- Velocidades medias en los accesos y avenidas principales que conectan barrios.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
- Velocidades altas en las carreteras perimetrales y vías de circunvalación.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Esta distribución evidencia un patrón típico de ciudad compacta, donde el centro está orientado a la movilidad lenta y la periferia a la circulación rápida. También permite identificar los corredores principales de entrada y salida, así como las zonas donde el tráfico puede generar barreras para la movilidad peatonal o ciclista.&amp;lt;br&amp;gt;&lt;br /&gt;
=== Mapa de densidad de población ===&lt;br /&gt;
Finalmente, se elaboró un mapa de densidad de población, a partir de las secciones censales del INE. Para ello, se calculó la superficie de cada sección y se obtuvo la densidad como el cociente entre la población total y el área correspondiente, expresada en habitantes por kilómetro cuadrado.&lt;br /&gt;
&lt;br /&gt;
Este mapa se introduce como un análisis complementario, ya que permite:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
- Identificar las zonas con mayor concentración de población.&amp;lt;br&amp;gt;&lt;br /&gt;
- Relacionar la distribución de zonas verdes con la población a la que potencialmente dan servicio.&amp;lt;br&amp;gt;&lt;br /&gt;
- Detectar áreas densamente pobladas con menor acceso a espacios verdes.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La incorporación de este mapa aporta una dimensión social al estudio, fundamental para la evaluación de la equidad territorial.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center&amp;quot;&amp;gt;&lt;br /&gt;
[[Archivo:Densisego.jpeg|600px]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
En el mapa se observa una concentración muy elevada de densidad poblacional en el núcleo central de Segovia. Las zonas del Centro Histórico, San Millán, José Zorrilla y Nueva Segovia presentan los valores más altos, representados con los tonos más oscuros. Estas áreas forman un corredor continuo de alta densidad que coincide con los barrios más consolidados y con mayor presencia de vivienda en bloque.&lt;br /&gt;
&lt;br /&gt;
A medida que se avanza hacia la periferia, la densidad disminuye de forma progresiva. Los barrios situados en los bordes del núcleo urbano muestran valores intermedios, mientras que las áreas más alejadas, como La Lastrilla, San Cristóbal de Segovia o Palazuelos de Eresma, presentan densidades mucho más bajas, asociadas a un modelo de vivienda más disperso y con menor altura edificatoria.&lt;br /&gt;
&lt;br /&gt;
También se aprecia que las zonas verdes y los espacios naturales que rodean la ciudad coinciden con áreas de densidad muy reducida, lo que refuerza la separación entre el núcleo urbano compacto y el entorno periurbano. La topografía y la presencia de infraestructuras viarias influyen en esta distribución, ya que las zonas con mayores pendientes o con barreras físicas muestran menor ocupación residencial.&lt;br /&gt;
&lt;br /&gt;
En conjunto, el mapa refleja un patrón de ciudad compacta, con un centro densamente poblado y una periferia más dispersa, lo que tiene implicaciones directas en la movilidad, el acceso a servicios y la planificación urbana.&lt;br /&gt;
&lt;br /&gt;
== Conclusiones y Propuestas ==  &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
El análisis conjunto de la distribución de zonas verdes, su accesibilidad peatonal, la relación con la red viaria, la cobertura del transporte público y la densidad de población permite obtener una visión integrada del sistema urbano de Segovia. Los resultados muestran que la ciudad dispone de una base verde amplia y diversa, especialmente en su periferia, donde se concentran bosques, masas forestales y praderas que conforman un cinturón natural de gran valor ambiental. Sin embargo, en el interior urbano predominan espacios verdes más pequeños y fragmentados, cuya continuidad ecológica y funcional es limitada.&lt;br /&gt;
&lt;br /&gt;
Los buffers generados alrededor de las zonas verdes revelan diferencias claras en la accesibilidad teórica: mientras que las áreas naturales periféricas generan amplias zonas de influencia, los parques y jardines urbanos presentan áreas de alcance más reducido. La intersección entre estos buffers y la red de carreteras muestra puntos donde la proximidad entre vías y zonas verdes facilita el acceso, pero también zonas donde la infraestructura viaria actúa como barrera.&lt;br /&gt;
&lt;br /&gt;
El análisis del transporte público evidencia una cobertura desigual. Las líneas de autobús conectan adecuadamente el centro y los ejes principales, pero presentan menor presencia en barrios periféricos, lo que condiciona el acceso a determinadas zonas verdes. Las rutas ciclistas y peatonales complementan esta movilidad, aunque su distribución no siempre garantiza conexiones directas con todos los espacios naturales.&lt;br /&gt;
&lt;br /&gt;
El mapa de velocidades confirma la jerarquía viaria de la ciudad: velocidades bajas en el centro, medias en los accesos y altas en la periferia. Esta estructura influye directamente en la accesibilidad peatonal y ciclista, ya que las vías rápidas pueden generar discontinuidades en los recorridos hacia las zonas verdes.&lt;br /&gt;
&lt;br /&gt;
Finalmente, el análisis de densidad poblacional muestra un patrón de ciudad compacta, con un núcleo central densamente poblado y una periferia más dispersa. Esta distribución implica que una parte significativa de la población reside en áreas donde los espacios verdes son más pequeños y fragmentados, lo que refuerza la importancia de mejorar la accesibilidad y la conectividad interna.&lt;br /&gt;
&lt;br /&gt;
En conjunto, los resultados indican que Segovia cuenta con un sistema verde valioso, pero con desigualdades en accesibilidad y conectividad que afectan de manera diferente a los distintos barrios. La topografía, la red viaria y la cobertura del transporte público son factores determinantes en estas diferencias.&lt;br /&gt;
&lt;br /&gt;
A partir de los resultados obtenidos, se plantean las siguientes propuestas orientadas a mejorar la equidad territorial y la accesibilidad a las zonas verdes:&lt;br /&gt;
&lt;br /&gt;
1. Mejorar la conectividad peatonal entre parques urbanos y zonas verdes periféricas, creando corredores verdes o rutas peatonales continuas que reduzcan la fragmentación interior.&lt;br /&gt;
&lt;br /&gt;
2. Ampliar la red ciclista hacia áreas actualmente desconectadas, especialmente en barrios periféricos donde la bicicleta puede ser una alternativa eficaz al transporte público.&lt;br /&gt;
&lt;br /&gt;
3. Reforzar la cobertura del transporte público en zonas con menor accesibilidad, incorporando nuevas paradas o ajustando recorridos para mejorar la conexión con parques y jardines.&lt;br /&gt;
&lt;br /&gt;
4. Reducir el efecto barrera de las vías rápidas, mediante pasos peatonales seguros, señalización específica o intervenciones de calmado de tráfico en puntos críticos.&lt;br /&gt;
&lt;br /&gt;
5. Crear nuevas zonas verdes en áreas densamente pobladas con déficit de espacios libres, especialmente en barrios del centro y zonas consolidadas donde la demanda social es mayor.&lt;br /&gt;
&lt;br /&gt;
6. Revalorizar y mejorar los parques existentes, incorporando equipamientos, zonas de sombra, áreas de descanso y elementos que fomenten su uso cotidiano.&lt;br /&gt;
&lt;br /&gt;
7. Integrar la topografía en la planificación de accesos, priorizando rutas con pendientes suaves y mejorando la accesibilidad universal en zonas con desniveles pronunciados.&lt;br /&gt;
&lt;br /&gt;
Estas propuestas buscan avanzar hacia un sistema verde más accesible, continuo y equitativo, donde todos los habitantes de Segovia puedan disfrutar de espacios naturales de calidad independientemente de su barrio de residencia.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Categoría:Sistemas de Información Geográfica Aplicados a la Ingeniería Civil]]&lt;br /&gt;
[[Categoría:SIGAIC_25/26]]&lt;/div&gt;</summary>
		<author><name>Andrea.amo</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/wiki/Evaluaci%C3%B3n_del_Impacto_de_los_Incendios_Forestales_en_la_Red_Natura_2000_de_Asturias</id>
		<title>Evaluación del Impacto de los Incendios Forestales en la Red Natura 2000 de Asturias</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/wiki/Evaluaci%C3%B3n_del_Impacto_de_los_Incendios_Forestales_en_la_Red_Natura_2000_de_Asturias"/>
				<updated>2026-04-29T07:27:59Z</updated>
		
		<summary type="html">&lt;p&gt;Daniel Portincasa: /* Metodología */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ TrabajoSIG | Evaluación del Impacto de los Incendios Forestales en la Red Natura 2000 de Asturias | Daniel Portincasa Navarro&amp;lt;br&amp;gt;Matías Rodríguez Obon&amp;lt;br&amp;gt;Marina Herreros Rodríguez | [[:Categoría:SIGAIC_25/26|Curso 25/26]] }}&lt;br /&gt;
El presente trabajo tiene como finalidad analizar el impacto de los incendios forestales sobre los espacios protegidos pertenecientes a la Red Natura 2000 en el Principado de Asturias, centrándose específicamente en las áreas clasificadas como ZEPA, ZEC/LIC y ZEPA/ZEC/LIC. Para llevar a cabo este análisis, se ha utilizado un software de Sistemas de Información Geográfica (SIG), en particular QGIS, herramienta que ha permitido la integración, tratamiento y representación de información tanto espacial como temática.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Para ello, se han recopilado, por un lado, datos espaciales relativos a áreas quemadas a escala europea, y por otro, información geográfica de los espacios protegidos de la Red Natura 2000 en Asturias. Asimismo, se ha incorporado al análisis una capa de susceptibilidad a incendios forestales, seleccionando aquellas zonas con probabilidad muy alta de afección, con el objetivo de identificar áreas especialmente vulnerables dentro del territorio de estudio. A partir de la combinación de estos datos, se han obtenido indicadores numéricos que permiten cuantificar el grado de afección de los incendios sobre dichos espacios protegidos, los cuales han sido representados mediante diversas cartografías temáticas.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Finalmente, el trabajo incluye una sección de conclusiones en la que, a partir de los resultados obtenidos, se evalúa la relación entre los incendios forestales y la Red Natura 2000, así como la importancia de considerar la susceptibilidad del territorio para la planificación y gestión ambiental, identificando aquellas zonas prioritarias de actuación en función de su nivel de afección y vulnerabilidad.&lt;br /&gt;
&lt;br /&gt;
== Introducción ==&lt;br /&gt;
El Principado de Asturias es una de las comunidades autónomas de España con una destacada riqueza natural, caracterizada por la presencia de ecosistemas de gran valor ecológico, especialmente ligados a la montaña y a amplias masas forestales. Esta diversidad ha motivado la declaración de numerosos espacios protegidos, integrados en la Red Natura 2000 bajo las figuras de LIC (Lugar de Importancia Comunitaria), ZEC (Zona Especial de Conservación) y ZEPA (Zona de Especial Protección para las Aves). Estos espacios constituyen una parte fundamental del territorio asturiano y desempeñan un papel clave en la conservación de la biodiversidad.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Como se podrá observar más adelante en el desarrollo del proyecto, existen zonas que presentan múltiples figuras de protección, al coincidir en un mismo espacio las categorías ZEC/LIC y ZEPA, lo que refleja la elevada importancia ambiental de determinados enclaves del territorio.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sin embargo, esta riqueza natural se ve amenazada de forma recurrente por los incendios forestales, cuya frecuencia en Asturias supone un importante riesgo ambiental, económico y social, afectando directamente a la vegetación, el suelo y la fauna. En muchos casos, estos incendios están relacionados con factores como el abandono rural o la acumulación de biomasa, lo que incrementa la vulnerabilidad del territorio.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En este contexto, surge la necesidad de analizar el grado de afección de los incendios forestales sobre los espacios protegidos de la Red Natura 2000 en Asturias. Además, en el presente trabajo se ha incorporado el análisis de la susceptibilidad del territorio frente a incendios, considerando específicamente aquellas zonas con probabilidad muy alta de afección, con el objetivo de identificar áreas especialmente vulnerables.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El proyecto se desarrolla mediante el uso de Sistemas de Información Geográfica (SIG), integrando información relativa a incendios forestales y espacios protegidos. El objetivo principal es cuantificar la superficie afectada dentro de la Red Natura 2000, así como evaluar la relación entre incendios y zonas de alta susceptibilidad, proporcionando una base objetiva que contribuya a la planificación, prevención, gestión y conservación del territorio.&lt;br /&gt;
&lt;br /&gt;
== Metodología ==&lt;br /&gt;
En primer lugar, se recopilaron las capas necesarias: una capa de incendios forestales (procedente de EFFIS u otras fuentes satelitales) y una capa vectorial de los espacios protegidos de la Red Natura 2000 (ZEC/LIC y ZEPA). Asimismo, se incorporó una capa de límites administrativos para delimitar el ámbito de estudio a la comunidad autónoma de Asturias.&lt;br /&gt;
&lt;br /&gt;
Posteriormente, todas las capas fueron reproyectadas a un sistema de coordenadas métrico común (ETRS89 / UTM zona 30N, EPSG:25830) y recortadas al ámbito de Asturias mediante la herramienta ''Vectorial &amp;gt; Herramientas de geoproceso &amp;gt; Recortar (Clip)''.&lt;br /&gt;
&lt;br /&gt;
A continuación, se procedió al análisis espacial mediante operaciones de geoprocesamiento. En primer lugar, se utilizó la herramienta ''Vectorial &amp;gt; Herramientas de geoproceso &amp;gt; Intersección'' para obtener las áreas de la Red Natura 2000 afectadas por incendios forestales. Esta capa permitió identificar las zonas protegidas impactadas y cuantificar su superficie.&lt;br /&gt;
&lt;br /&gt;
Para identificar las zonas no afectadas dentro de la Red Natura, se aplicó la herramienta ''Vectorial &amp;gt; Herramientas de geoproceso &amp;gt; Diferencia'', restando las áreas quemadas a la capa de Red Natura. Del mismo modo, para obtener las áreas quemadas fuera de la Red Natura 2000, se utilizó nuevamente la herramienta ''Diferencia'', restando la Red Natura a la capa de incendios.&lt;br /&gt;
&lt;br /&gt;
Adicionalmente, se realizó una clasificación de las áreas quemadas en función de su severidad (en aquellos casos en los que el dataset lo permitía), mediante simbología graduada en QGIS, lo que permitió generar mapas temáticos diferenciando incendios de alta y muy alta intensidad.&lt;br /&gt;
&lt;br /&gt;
Para el cálculo de superficies, se utilizó la tabla de atributos de las capas resultantes junto con la herramienta ''Calculadora de campos'', generando un nuevo campo de área en unidades métricas (m² o ha). Los resultados obtenidos fueron exportados a hojas de cálculo (Excel) para el cálculo de porcentajes y la elaboración de gráficos, como diagramas circulares de afección.&lt;br /&gt;
&lt;br /&gt;
Finalmente, se elaboraron diversos mapas temáticos que representan: la distribución de incendios en Asturias, el porcentaje de superficie afectada dentro de la Red Natura 2000, las áreas de alta y muy alta intensidad de incendio dentro de los espacios protegidos, así como las zonas afectadas fuera de estos. Estos productos permiten analizar la distribución espacial del impacto y evaluar la vulnerabilidad de los espacios protegidos frente a incendios forestales.&lt;br /&gt;
&lt;br /&gt;
== Resultados ==&lt;br /&gt;
A continuación, se presentan los principales resultados obtenidos en el análisis del impacto de los incendios forestales y su relación con la susceptibilidad en el Principado de Asturias.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Incendios y susceptibilidad ===&lt;br /&gt;
&lt;br /&gt;
En primer lugar, se ha analizado la relación entre los incendios forestales y los distintos niveles de susceptibilidad del territorio. Para ello, se ha calculado el porcentaje de superficie afectada por incendios en función del nivel de susceptibilidad (baja, media, alta y muy alta) respecto al total de la superficie de Asturias.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Estos resultados se han representado mediante gráficos elaborados en Excel, lo que permite visualizar de forma clara la distribución de los incendios en función de la susceptibilidad del territorio.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Porcentaje de Red Natura 2000 en Asturias ===&lt;br /&gt;
&lt;br /&gt;
Se ha calculado el porcentaje que representan los espacios de la Red Natura 2000 respecto a la superficie total del Principado de Asturias.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Este resultado permite contextualizar la importancia de las áreas protegidas dentro del territorio de estudio y su posible exposición a incendios forestales.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Incendios en zonas de susceptibilidad muy alta ===&lt;br /&gt;
&lt;br /&gt;
Se ha determinado el porcentaje de incendios que se localizan en zonas con **susceptibilidad muy alta** dentro del territorio de Asturias.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Este análisis permite identificar en qué medida los incendios se concentran en las áreas más vulnerables del territorio.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Incendios en zonas de susceptibilidad muy alta dentro de Red Natura 2000 ===&lt;br /&gt;
&lt;br /&gt;
Se ha analizado el porcentaje de incendios que afectan a zonas de **susceptibilidad muy alta** dentro de los espacios protegidos de la Red Natura 2000.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Este resultado es clave para evaluar la vulnerabilidad de las áreas protegidas frente a incendios forestales.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Incendios en zonas de susceptibilidad muy alta fuera de Red Natura 2000 ===&lt;br /&gt;
&lt;br /&gt;
Por último, se ha calculado el porcentaje de incendios que se producen en zonas de **susceptibilidad muy alta fuera de los espacios protegidos** de la Red Natura 2000.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Este análisis permite comparar la distribución de los incendios entre áreas protegidas y no protegidas, así como identificar posibles diferencias en el comportamiento del fenómeno.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Conclusiones ==&lt;br /&gt;
&lt;br /&gt;
A partir del análisis realizado, se puede concluir que existe una relación significativa entre los incendios forestales y las características del territorio en el Principado de Asturias. En particular, se observa que una parte importante de los incendios se concentra en zonas con niveles elevados de susceptibilidad, lo que confirma la utilidad de este tipo de cartografías como herramienta para la identificación de áreas vulnerables.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Asimismo, el estudio ha puesto de manifiesto que los espacios protegidos de la Red Natura 2000 no son ajenos a este fenómeno, ya que una proporción relevante de las superficies afectadas por incendios se localiza dentro de estos espacios. Esto resulta especialmente preocupante debido al alto valor ecológico de dichas áreas, cuya conservación es prioritaria.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El análisis específico de las zonas con susceptibilidad muy alta ha permitido identificar aquellas áreas donde el riesgo potencial de incendios es mayor, tanto dentro como fuera de la Red Natura 2000. En este sentido, se observa que, aunque existen incendios en espacios protegidos, también se produce una parte significativa fuera de ellos, lo que evidencia la necesidad de abordar el problema de forma integral en todo el territorio.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En conjunto, los resultados obtenidos ponen de manifiesto la importancia de integrar la información sobre incendios forestales y susceptibilidad en la planificación territorial y la gestión ambiental. Este tipo de análisis permite no solo cuantificar la afección existente, sino también anticipar posibles escenarios futuros y priorizar actuaciones en las zonas más vulnerables.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalmente, se destaca la utilidad de los Sistemas de Información Geográfica (SIG) como herramienta fundamental para el análisis espacial de este tipo de problemáticas, facilitando la toma de decisiones orientadas a la prevención, conservación y gestión sostenible del territorio.&lt;br /&gt;
&lt;br /&gt;
== Referencias ==&lt;br /&gt;
Ministerio para la Transición Ecológica y el Reto Demográfico. (s.f.). Incendios forestales - Información disponible. Gobierno de España. https://www.miteco.gob.es/es/biodiversidad/servicios/banco-datos-naturaleza/informacion-disponible/incendios-forestales.html (consulta: mayo de 2026).&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Gobierno del Principado de Asturias. &amp;lt;i&amp;gt;SITPA – IDEAS Asturias. Centro de descargas&amp;lt;/i&amp;gt;. Disponible en: https://ideas.asturias.es/centro-de-descargas (consulta: mayo de 2026).&lt;br /&gt;
&lt;br /&gt;
== Anejo ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Categoría:Sistemas de Información Geográfica Aplicados a la Ingeniería Civil]]&lt;br /&gt;
[[Categoría:SIGAIC_25/26]]&lt;/div&gt;</summary>
		<author><name>Daniel Portincasa</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/wiki/Modelizaci%C3%B3n_de_zonas_inundables_en_la_ribera_del_R%C3%ADo_Mi%C3%B1o_en_el_entorno_de_Lugo</id>
		<title>Modelización de zonas inundables en la ribera del Río Miño en el entorno de Lugo</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/wiki/Modelizaci%C3%B3n_de_zonas_inundables_en_la_ribera_del_R%C3%ADo_Mi%C3%B1o_en_el_entorno_de_Lugo"/>
				<updated>2026-04-28T15:57:59Z</updated>
		
		<summary type="html">&lt;p&gt;Alejandra.gacanle: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ TrabajoSIG | Análisis de zonas inundables en la ribera del Río Miño en el entorno de Lugo | Felipe Ferrero Fandiño, Alejandra García-Agulló Canle, Sara López Caro | [[:Categoría:SIGAIC_25/26|Curso 25/26]] }}&lt;br /&gt;
&lt;br /&gt;
== Introducción ==&lt;br /&gt;
El riesgo de inundación representa una de las mayores amenazas naturales en el ámbito de la Ingeniería Civil y Territorial, tanto por su potencial destructivo sobre las infraestructuras críticas como por su profundo impacto socioeconómico y ambiental. Se hace indispensable el uso de herramientas de análisis espacial para la delimitación de zonas con riesgo significativo de inundación. El empleo de Sistemas de Información Geográfica (SIG) se ha consolidado como el estándar técnico para la toma de decisiones en la planificación urbana y la gestión de cuencas hidrográficas.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:rio.jpg|600px|miniaturadeimagen|derecha|Río Miño]]&lt;br /&gt;
&lt;br /&gt;
El río Miño, a su paso por el núcleo urbano de Lugo, constituye un escenario de análisis de alta complejidad. A pesar de ser un elemento vertebrador del paisaje y la biodiversidad de la zona, su régimen hidrológico presenta episodios periódicos de avenidas que afectan directamente a zonas de alto valor patrimonial, recreativo y residencial. La configuración geomorfológica del valle del Miño en este tramo, caracterizada por llanuras de inundación que han sido históricamente ocupadas, eleva la exposición de la ciudad ante eventos extremos. Estas llanuras han sido muy relevantes en el desarrollo de la ciudad en el pasado, sirviendo para el cultivo y pastoreo de animales. Hoy en día, y debido al desarrollo urbano y rural avenidas o eventos con un alto periodo de retorno podrían significar destrozos que alterasen la vida de la comunidad. &lt;br /&gt;
&lt;br /&gt;
La problemática principal se centra en la presión antrópica ejercida sobre las riberas del río Miño en Lugo. Zonas emblemáticas como el entorno del Puente Romano, el Club Fluvial y el complejo termal del Balneario de Lugo se encuentran situadas en la llanura de inundación natural del cauce. La recurrencia de estos episodios no solo representa un riesgo para la seguridad de la población, sino que también compromete la operatividad de infraestructuras esenciales de transporte y saneamiento.&lt;br /&gt;
&lt;br /&gt;
Un aspecto determinante del estudio es la delimitación espacial del área de trabajo. El análisis se focaliza en el tramo de entrada del cauce al municipio, donde la morfología del río comienza a interactuar con el tejido urbano consolidado. En la cartografía generada, el núcleo de Lugo aparece de forma asimétrica en el margen de la zona de estudio, lo que permite analizar con detalle cómo la mancha de inundación avanza desde las áreas periurbanas hacia los puntos críticos del casco histórico.&lt;br /&gt;
&lt;br /&gt;
== Metodología ==&lt;br /&gt;
La metodología empleada para la realización de este estudio se fundamenta en el uso del software de código abierto QGIS (Quantum GIS). El flujo de trabajo se ha diseñado para integrar datos ráster de elevación con capas vectoriales, permitiendo un análisis espacial preciso de la interacción entre el cauce del río Miño, sus posibles crecidas, el área rural previa a la llegada a Lugo y el tejido urbano de la ciudad.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. Datos empleados y fuentes de información:&lt;br /&gt;
&lt;br /&gt;
Para el desarrollo del proyecto se han utilizado los siguientes recursos cartográficos oficiales obtenidos a través del Centro Nacional de Información Geográfica (CNIG):&lt;br /&gt;
&lt;br /&gt;
Mapas MTN25: Cartografía digital a escala 1:25.000, específicamente la hoja MTN 0072‑4 LUGO, fundamental para la identificación de viales, edificios y puntos de interés.&lt;br /&gt;
&lt;br /&gt;
Modelos Digitales del Terreno (MDT): Archivos con un paso de malla de 25 metros procedentes del PNOA. Se han utilizado las hojas de elevaciones correspondientes al entorno de la ciudad para asegurar una base topográfica de alta resolución.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2. Preprocesamiento de datos y sistema de coordenadas:&lt;br /&gt;
&lt;br /&gt;
El primer paso consistió en la correcta importación de las capas al entorno SIG. Dada la ubicación geográfica de Lugo, se estableció como Sistema de Referencia de Coordenadas (SRC) el ETRS89 / UTM huso 29N (EPSG:25829), garantizando la compatibilidad métrica de la cartografía MTN 0072‑4 con los modelos de elevación. Se verificó la georreferenciación para evitar desplazamientos en el análisis de inundabilidad.&lt;br /&gt;
&lt;br /&gt;
La hoja seleccionada, al situarse Lugo en una de sus esquinas y abarcar todo el cauce hasta la llegada a la ciudad, permitió analizar el recorrido del río y la afección a otras estructuras antes de su entrada en el núcleo urbano.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3. Procesamiento, análisis y flujo cartográfico:&lt;br /&gt;
&lt;br /&gt;
El núcleo técnico del trabajo ha consistido en un análisis multiescala para simular el comportamiento dinámico del río Miño ante diferentes escenarios de avenida. El procedimiento se estructuró en un flujo de trabajo integrado que combina el análisis topográfico con la representación visual final:&lt;br /&gt;
&lt;br /&gt;
Modelización por niveles y periodos de retorno estimados: Se generaron capas de nivel con intervalos de 5 metros, comenzando desde la cota del cauce, sobre el MDT. Este procedimiento permite visualizar de forma escalonada cómo el crecimiento progresivo del río afectaría al entorno rural y urbano de Lugo.&lt;br /&gt;
&lt;br /&gt;
== Resultados ==&lt;br /&gt;
Como resultado del análisis geoespacial realizado en el entorno de Lugo, se han generado siete escenarios de inundabilidad principales correspondientes a diferentes periodos de retorno, incluyendo un escenario extremo teórico en el que el río alcanzaría los 410 m. Los mapas cartográficos resultantes, donde se aprecia la mancha de inundación sobre la hoja MTN 0072-4, se encuentran detallados en el Anejo 1.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. Análisis de la mancha de inundación por periodos de retorno:&lt;br /&gt;
&lt;br /&gt;
Al observar las diferentes simulaciones sobre el terreno, se identifican hitos críticos de inundación en las infraestructuras y el patrimonio de la ribera lucense. A continuación se detallan las afecciones detectadas según el calado y la recurrencia:&lt;br /&gt;
&lt;br /&gt;
- Escenario de media probabilidad (T = 100 años):  &lt;br /&gt;
En este punto, la inundación alcanza cotas críticas, de hasta 380 m, que afectan al patrimonio histórico. El agua rodea la base del Puente Romano y comienza a invadir el complejo de las Termas Romanas (Balneario). La conectividad en viales secundarios de la ribera se ve seriamente comprometida. Se observa el anegamiento completo de los paseos fluviales y de las instalaciones exteriores del Club Fluvial de Lugo. Por otra parte, en los tramos anteriores a la ciudad, el Aserradero del Castelo quedaría inundado y pequeñas poblaciones en la ribera del Miño sufrirían daños de diversa magnitud.&lt;br /&gt;
&lt;br /&gt;
- Escenario de baja probabilidad (T = 500 años):  &lt;br /&gt;
Representa el escenario catastrófico, con una subida en torno a los 10 m. La mancha de inundación se expande significativamente por la llanura de inundación en el tramo de entrada a la ciudad. Se observa afección en infraestructuras de transporte (entorno de la N‑VI) y en urbanizaciones residenciales periféricas situadas en cotas bajas. Esta subida también provocaría el arrastre de puentes pequeños antes de la llegada a Lugo y daños severos en el Puente Romano.&lt;br /&gt;
&lt;br /&gt;
- Escenario teórico:  &lt;br /&gt;
Representa un escenario de muy baja probabilidad, con subidas superiores a 15 m en el cauce del río. Esto supondría la inundación total de Regueiro, una pequeña población anterior a Lugo, así como el destrozo de bienes históricos como el Dolmen de Aldai, el Castro de Taboelle, la Aceña do Rei Chiquito y los Túmulos dos Carrís. También se producirían afecciones muy graves en entornos naturales protegidos como el LIC Parga‑Ladra‑Támega o el centro de conservación Marcelle Natureza, además de un daño total en negocios y viviendas situados a una distancia media del cauce original del río.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2. Observaciones sobre el proceso y el encuadre espacial:&lt;br /&gt;
&lt;br /&gt;
La intersección de la capa del MDT (PNOA) ha permitido verificar que la topografía de la ribera izquierda es más vulnerable, presentando pendientes más suaves que facilitan la expansión lateral del agua. Por el contrario, la margen derecha presenta elevaciones que actúan como barreras naturales, protegiendo parte del tejido urbano pero aumentando la velocidad del flujo en el canal principal.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3. Identificación de puntos críticos:&lt;br /&gt;
&lt;br /&gt;
Tras el análisis comparativo de calados, topografía y usos del suelo, se identifican varios puntos como instalaciones de máxima vulnerabilidad ante inundaciones de diferente gravedad:&lt;br /&gt;
&lt;br /&gt;
- Entorno del Puente Romano: Por su valor patrimonial y por actuar como estrechamiento hidráulico.&lt;br /&gt;
&lt;br /&gt;
- Complejo del Club Fluvial: Por ser el primer hito urbano en recibir el impacto de la crecida en el tramo de entrada.&lt;br /&gt;
&lt;br /&gt;
- Zonas recreativas periurbanas: Cuyos accesos quedan totalmente inhabilitados incluso en periodos de retorno bajos.&lt;br /&gt;
&lt;br /&gt;
- LIC Parga‑Ladra‑Támega: El espacio protegido más afectado, con afección incluso ante crecidas de baja magnitud.&lt;br /&gt;
&lt;br /&gt;
== Conclusiones ==&lt;br /&gt;
Tras el análisis geoespacial de la ribera del río Miño en Lugo, se han extraído las siguientes conclusiones finales que sintetizan los resultados obtenidos:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Resiliencia y vulnerabilidad del núcleo urbano:  &lt;br /&gt;
&lt;br /&gt;
Se ha verificado que, si bien el casco consolidado de Lugo presenta una elevación que lo protege de las crecidas más extremas, sus accesos y zonas de esparcimiento son altamente susceptibles a variaciones en la lámina de agua. La inundación de los puntos estratégicos es progresiva, comenzando por las áreas recreativas en escenarios de periodos de retorno bajos y alcanzando infraestructuras críticas en los escenarios de mayor recurrencia.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Afección a hitos estratégicos:  &lt;br /&gt;
&lt;br /&gt;
Los resultados confirman que el entorno del Puente Romano y el Club Fluvial constituyen las zonas de mayor riesgo. La proximidad de estas instalaciones al cauce facilita el acceso ciudadano al recurso hídrico en condiciones normales, pero las convierte en los primeros puntos de conflicto ante avenidas, comprometiendo tanto el patrimonio histórico como la operatividad de los servicios deportivos de la ciudad.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eficacia del análisis espacial asimétrico:  &lt;br /&gt;
&lt;br /&gt;
La disposición de Lugo en un margen de la zona de estudio ha resultado ser una decisión técnica acertada. Ha permitido identificar con precisión cómo la mancha de inundación progresa desde las zonas de entrada al municipio, donde el río dispone de mayor espacio de expansión lateral, antes de verse constreñido por la topografía del casco urbano.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Impacto territorial y desarrollo futuro:  &lt;br /&gt;
&lt;br /&gt;
La implantación de este modelo SIG genera un impacto positivo en la gestión local, permitiendo atraer inversión sostenible y mejorar la seguridad de infraestructuras de transporte como la N‑VI. Como mejora futura, se recomienda la integración de sensores de caudal automatizados y la implementación de modelos hidráulicos 2D (tipo HEC‑RAS) para simular velocidades de flujo que optimicen los planes de evacuación.&lt;br /&gt;
&lt;br /&gt;
== Anejos ==&lt;br /&gt;
[[Archivo:38.jpg|900px|miniaturadeimagen|derecha|Área inundada a cota 380]]&lt;br /&gt;
[[Archivo:85.jpg|900px|miniaturadeimagen|derecha|Área inundada a cota 385]]&lt;br /&gt;
[[Archivo:90.jpg|900px|miniaturadeimagen|derecha|Área inundada a cota 390]]&lt;br /&gt;
[[Archivo:95.jpg|900px|miniaturadeimagen|derecha|Área inundada a cota 395]]&lt;br /&gt;
[[Archivo:00.jpg|900px|miniaturadeimagen|derecha|Área inundada a cota 400]]&lt;br /&gt;
[[Archivo:05.jpg|900px|miniaturadeimagen|derecha|Área inundada a cota 405]]&lt;br /&gt;
[[Archivo:10.jpg|900px|miniaturadeimagen|derecha|Área inundada a cota 410]]&lt;br /&gt;
&lt;br /&gt;
[[Categoría:Sistemas de Información Geográfica Aplicados a la Ingeniería Civil]]&lt;br /&gt;
[[Categoría:SIGAIC_25/26]]&lt;/div&gt;</summary>
		<author><name>Alejandra.gacanle</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/wiki/Ecuacion_del_Calor_CPP</id>
		<title>Ecuacion del Calor CPP</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/wiki/Ecuacion_del_Calor_CPP"/>
				<updated>2026-04-13T08:19:24Z</updated>
		
		<summary type="html">&lt;p&gt;Paulasanchezjauregui: /* EV */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ TrabajoED | Ecuación del calor. Grupo CPP| [[:Categoría:EDP|EDP]]|[[:Categoría:EDP25/26|2025-26]] | Paula Sánchez&lt;br /&gt;
&lt;br /&gt;
Paula Mellado&lt;br /&gt;
&lt;br /&gt;
Clara García-Hoz}}&lt;br /&gt;
&lt;br /&gt;
[[Archivo: cpp.jpeg||800px]]&lt;br /&gt;
&lt;br /&gt;
===Evolución Datos Iniciales ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
# 1. Definimos el dominio&lt;br /&gt;
x = np.linspace(-2, 2, 1000)&lt;br /&gt;
&lt;br /&gt;
# Número de modos de Fourier&lt;br /&gt;
N = 80&lt;br /&gt;
&lt;br /&gt;
# Fijamos semilla para reproducibilidad&lt;br /&gt;
np.random.seed(0)&lt;br /&gt;
&lt;br /&gt;
# 2. Coeficientes aleatorios&lt;br /&gt;
# Generamos coeficientes con decaimiento 1/n (Esto permite tener bastante ruido al inicio)&lt;br /&gt;
a = np.random.normal(0, 1, N) / np.arange(1, N+1)&lt;br /&gt;
b = np.random.normal(0, 1, N) / np.arange(1, N+1)&lt;br /&gt;
&lt;br /&gt;
# 3. Solución de la ecuación del calor&lt;br /&gt;
def u(x, t):&lt;br /&gt;
    resultado = np.zeros_like(x)&lt;br /&gt;
    &lt;br /&gt;
    for n in range(1, N+1):&lt;br /&gt;
        modo = a[n-1]*np.cos(n*x) + b[n-1]*np.sin(n*x)&lt;br /&gt;
        resultado += modo * np.exp(-n**2 * t)&lt;br /&gt;
        &lt;br /&gt;
    return resultado&lt;br /&gt;
&lt;br /&gt;
# 4. Instantes de tiempo&lt;br /&gt;
tiempos = [0, 0.005, 0.02, 0.1]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# 5. Representación gráfica&lt;br /&gt;
plt.figure(figsize=(10,6))&lt;br /&gt;
&lt;br /&gt;
for t in tiempos:&lt;br /&gt;
    plt.plot(x, u(x, t), label=f&amp;quot;t = {t}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
plt.title(&amp;quot;Evolución temporal de la solución&amp;quot;)&lt;br /&gt;
plt.xlabel(&amp;quot;x&amp;quot;)&lt;br /&gt;
plt.ylabel(&amp;quot;u(x,t)&amp;quot;)&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Comportamiento del promedio  ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
# 1. Definimos el tiempo&lt;br /&gt;
t = np.linspace(0.01, 1.2, 1000)&lt;br /&gt;
&lt;br /&gt;
# 2. Modos considerados&lt;br /&gt;
n_values = [1, 2, 3, 4]&lt;br /&gt;
&lt;br /&gt;
# Valores esperados de los coeficientes&lt;br /&gt;
E_an = [1.0, -0.8, 0.5, -0.3]&lt;br /&gt;
&lt;br /&gt;
# 3. Cálculo del promedio total&lt;br /&gt;
esperanza_total = np.zeros_like(t)&lt;br /&gt;
&lt;br /&gt;
plt.figure(figsize=(10, 6))&lt;br /&gt;
&lt;br /&gt;
for i, n in enumerate(n_values):&lt;br /&gt;
    &lt;br /&gt;
    # Contribución de cada modo&lt;br /&gt;
    contribucion = E_an[i] * np.exp(-(n**2) * t)&lt;br /&gt;
    &lt;br /&gt;
    # Sumamos al promedio total&lt;br /&gt;
    esperanza_total += contribucion&lt;br /&gt;
    &lt;br /&gt;
    # Dibujamos cada modo&lt;br /&gt;
    plt.plot(t, contribucion, '--', alpha=0.7,&lt;br /&gt;
             label=f'Modo n={n}')&lt;br /&gt;
&lt;br /&gt;
# 4. Dibujamos el promedio total&lt;br /&gt;
plt.plot(t, esperanza_total, color='black', linewidth=3,&lt;br /&gt;
         label='Promedio total')&lt;br /&gt;
&lt;br /&gt;
# Línea horizontal en 0&lt;br /&gt;
plt.axhline(0, linestyle='-', alpha=0.5)&lt;br /&gt;
&lt;br /&gt;
# 5. Detalles de la gráfica&lt;br /&gt;
&lt;br /&gt;
plt.title('Evolución del promedio en x = 0')&lt;br /&gt;
plt.xlabel('t')&lt;br /&gt;
plt.ylabel('E[u(0,t)]')&lt;br /&gt;
plt.grid(alpha=0.6)&lt;br /&gt;
plt.legend()&lt;br /&gt;
&lt;br /&gt;
plt.tight_layout()&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Categoría:EDP]]&lt;br /&gt;
[[Categoría:EDP25/26]]&lt;/div&gt;</summary>
		<author><name>Paulasanchezjauregui</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/wiki/Ecuaci%C3%B3n_del_calor_SAL</id>
		<title>Ecuación del calor SAL</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/wiki/Ecuaci%C3%B3n_del_calor_SAL"/>
				<updated>2026-04-12T21:30:17Z</updated>
		
		<summary type="html">&lt;p&gt;Luis Zulueta: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ TrabajoED | Ecuación del calor. Grupo SAL | [[:Categoría:EDP|EDP]]|[[:Categoría:EDP25/26|2025-26]] | Sergio Maccanin &lt;br /&gt;
&lt;br /&gt;
Ángela Marquet &lt;br /&gt;
&lt;br /&gt;
Luis Zulueta  }}&lt;br /&gt;
&lt;br /&gt;
En este trabajo se estudia la ecuación de Black-Scholes y su relación con la ecuación del calor. &lt;br /&gt;
A continuación, se adjunta el PDF del póster.&lt;br /&gt;
[[Medio:Poster.SAL.pdf]]&lt;br /&gt;
[[Archivo:Calor.SAL.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Categoría:EDP]]&lt;br /&gt;
[[Categoría:EDP25/26]]&lt;/div&gt;</summary>
		<author><name>Luis Zulueta</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/wiki/Ecuaci%C3%B3n_del_calor_PDM</id>
		<title>Ecuación del calor PDM</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/wiki/Ecuaci%C3%B3n_del_calor_PDM"/>
				<updated>2026-04-12T21:18:47Z</updated>
		
		<summary type="html">&lt;p&gt;DiegoGR: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ TrabajoED | Ecuación del calor PDM| [[:Categoría:EDP|EDP]]|[[:Categoría:EDP25/26|2025-26]] | Diego García Raposo&lt;br /&gt;
&lt;br /&gt;
Paula Dopico Muñoz&lt;br /&gt;
&lt;br /&gt;
Manuel Herreros Zarco}}&lt;br /&gt;
&lt;br /&gt;
==Ecuación del calor==&lt;br /&gt;
&lt;br /&gt;
===Poster===&lt;br /&gt;
[[Archivo:EcCalor PDM-1(1).png|center|800px]]]]&lt;br /&gt;
&lt;br /&gt;
===Códigos===&lt;br /&gt;
====Decaimiento puntual y en L^2 en caso no acotado====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
clear; clc; close all;&lt;br /&gt;
&lt;br /&gt;
%% Mallado espacial y temporal&lt;br /&gt;
x = linspace(-8,8,600);&lt;br /&gt;
t = linspace(0.001,10,120);&lt;br /&gt;
y = linspace(-1,1,400);   % variable de integracion del dato inicial&lt;br /&gt;
&lt;br /&gt;
%% Solucion fundamental&lt;br /&gt;
G = @(z,t) (1./sqrt(4*pi*t)) .* exp(-(z.^2)./(4*t));&lt;br /&gt;
&lt;br /&gt;
%% Calculo de la solucion U(t,x)&lt;br /&gt;
U = zeros(length(t), length(x));&lt;br /&gt;
&lt;br /&gt;
for n = 1:length(t)&lt;br /&gt;
    tn = t(n);&lt;br /&gt;
    for i = 1:length(x)&lt;br /&gt;
        integrando = G(x(i)-y, tn);   % porque u0(y)=1 en [-1,1]&lt;br /&gt;
        U(n,i) = trapz(y, integrando);&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% =========================&lt;br /&gt;
%% 1. Decaimiento puntual&lt;br /&gt;
%% =========================&lt;br /&gt;
% Elegimos algunos puntos fijos&lt;br /&gt;
x_pts = [-0.5, 0, 0.5 1, 2, 4];&lt;br /&gt;
idx = zeros(size(x_pts));&lt;br /&gt;
&lt;br /&gt;
for k = 1:length(x_pts)&lt;br /&gt;
    [~, idx(k)] = min(abs(x - x_pts(k)));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
figure;&lt;br /&gt;
hold on;&lt;br /&gt;
for k = 1:length(x_pts)&lt;br /&gt;
    plot(t, U(:,idx(k)), 'LineWidth', 2);&lt;br /&gt;
end&lt;br /&gt;
grid on;&lt;br /&gt;
xlabel('t');&lt;br /&gt;
ylabel('u(x_0,t)');&lt;br /&gt;
title('Decaimiento puntual de la solucion');&lt;br /&gt;
legend('x=-0.5','x=0','x=0.5','x=1','x=2','x=4','Location','best');&lt;br /&gt;
&lt;br /&gt;
%% =========================&lt;br /&gt;
%% 2. Decaimiento en norma L2&lt;br /&gt;
%% =========================&lt;br /&gt;
L2 = zeros(size(t));&lt;br /&gt;
&lt;br /&gt;
for n = 1:length(t)&lt;br /&gt;
    L2(n) = sqrt(trapz(x, U(n,:).^2));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
figure;&lt;br /&gt;
plot(t, L2, 'LineWidth', 2);&lt;br /&gt;
grid on;&lt;br /&gt;
xlabel('t');&lt;br /&gt;
ylabel('||u(\cdot,t)||_{L^2}');&lt;br /&gt;
title('Decaimiento en norma L^2');&lt;br /&gt;
&lt;br /&gt;
%% =========================&lt;br /&gt;
%% 3. Superficie 3D opcional&lt;br /&gt;
%% =========================&lt;br /&gt;
[X,T] = meshgrid(x,t);&lt;br /&gt;
&lt;br /&gt;
figure;&lt;br /&gt;
surf(X,T,U);&lt;br /&gt;
shading interp;&lt;br /&gt;
colorbar;&lt;br /&gt;
xlabel('x');&lt;br /&gt;
ylabel('t');&lt;br /&gt;
zlabel('u(x,t)');&lt;br /&gt;
title('Solucion u(x,t)');&lt;br /&gt;
view(135,30);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
====Principio del máximo y aproximación de la solución por convolución====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
%% PRINCIPIO DEL MAXIMO - ECUACION DEL CALOR EN R&lt;br /&gt;
% Casos:&lt;br /&gt;
% 1) u0(x) = 1_{[-1,1]}(x)&lt;br /&gt;
% 2) u0(x) = exp(-x^2)&lt;br /&gt;
%&lt;br /&gt;
% Se usa la formula de convolucion:&lt;br /&gt;
% u(x,t) = \int Phi(x-y,t) u0(y) dy&lt;br /&gt;
% donde Phi(x,t) = 1/sqrt(4*pi*t) * exp(-x^2/(4*t))&lt;br /&gt;
&lt;br /&gt;
clear; close all; clc;&lt;br /&gt;
&lt;br /&gt;
%% Mallado espacial para representar la solucion&lt;br /&gt;
x = linspace(-6,6,1600);&lt;br /&gt;
&lt;br /&gt;
%% Instantes de tiempo&lt;br /&gt;
tvals = [0.005 0.02 0.1 0.5];&lt;br /&gt;
&lt;br /&gt;
%% Nucleo de calor&lt;br /&gt;
Phi = @(z,t) (1./sqrt(4*pi*t)) .* exp(-(z.^2)./(4*t));&lt;br /&gt;
&lt;br /&gt;
%% ============================================================&lt;br /&gt;
%% CASO 1: u0(x) = 1_{[-1,1]}(x)&lt;br /&gt;
%% ============================================================&lt;br /&gt;
&lt;br /&gt;
u0_1 = @(x) double(abs(x) &amp;lt;= 1);&lt;br /&gt;
&lt;br /&gt;
% Para la integral solo hace falta integrar en [-1,1]&lt;br /&gt;
y1 = linspace(-1,1,2500);&lt;br /&gt;
&lt;br /&gt;
figure('Name','Caso 1: u0 = 1_{[-1,1]}');&lt;br /&gt;
hold on; grid on;&lt;br /&gt;
&lt;br /&gt;
% Dato inicial&lt;br /&gt;
plot(x,u0_1(x),'k--','LineWidth',1.8,'DisplayName','$u_0(x)$');&lt;br /&gt;
&lt;br /&gt;
fprintf('============================\n');&lt;br /&gt;
fprintf('CASO 1: u0(x) = 1_{[-1,1]}(x)\n');&lt;br /&gt;
fprintf('Dato inicial: min = %.6f, max = %.6f\n', min(u0_1(x)), max(u0_1(x)));&lt;br /&gt;
&lt;br /&gt;
for k = 1:length(tvals)&lt;br /&gt;
    t = tvals(k);&lt;br /&gt;
&lt;br /&gt;
    % Matriz Z(i,j)=x_i-y_j&lt;br /&gt;
    Z = x(:) - y1(:).';&lt;br /&gt;
    integrando = Phi(Z,t);           &lt;br /&gt;
    U = trapz(y1, integrando, 2).';  &lt;br /&gt;
&lt;br /&gt;
    plot(x,U,'LineWidth',1.8,'DisplayName',['$t=', num2str(t), '$']);&lt;br /&gt;
&lt;br /&gt;
    fprintf('t = %.4f --&amp;gt; min = %.6f, max = %.6f\n', t, min(U), max(U));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
title('Principio del máximo en el primer problema','Interpreter','latex');&lt;br /&gt;
xlabel('$x$','Interpreter','latex');&lt;br /&gt;
ylabel('$u(x,t)$','Interpreter','latex');&lt;br /&gt;
legend('Location','best','Interpreter','latex');&lt;br /&gt;
hold off;&lt;br /&gt;
&lt;br /&gt;
%% ============================================================&lt;br /&gt;
%% CASO 2: u0(x) = exp(-x^2)&lt;br /&gt;
%% ============================================================&lt;br /&gt;
&lt;br /&gt;
u0_2 = @(x) exp(-x.^2);&lt;br /&gt;
&lt;br /&gt;
% Aproximamos la integral en un intervalo grande&lt;br /&gt;
y2 = linspace(-8,8,4000);&lt;br /&gt;
&lt;br /&gt;
figure('Name','Caso 2: u0 = exp(-x^2)');&lt;br /&gt;
hold on; grid on;&lt;br /&gt;
&lt;br /&gt;
% Dato inicial&lt;br /&gt;
plot(x,u0_2(x),'k--','LineWidth',1.8,'DisplayName','$u_0(x)$');&lt;br /&gt;
&lt;br /&gt;
fprintf('\n============================\n');&lt;br /&gt;
fprintf('CASO 2: u0(x) = exp(-x^2)\n');&lt;br /&gt;
fprintf('Dato inicial: min = %.6f, max = %.6f\n', min(u0_2(x)), max(u0_2(x)));&lt;br /&gt;
&lt;br /&gt;
for k = 1:length(tvals)&lt;br /&gt;
    t = tvals(k);&lt;br /&gt;
&lt;br /&gt;
    Z = x(:) - y2(:).';&lt;br /&gt;
    integrando = Phi(Z,t) .* exp(-(y2.^2));&lt;br /&gt;
    U = trapz(y2, integrando, 2).';&lt;br /&gt;
&lt;br /&gt;
    plot(x,U,'LineWidth',1.8,'DisplayName',['$t=', num2str(t), '$']);&lt;br /&gt;
&lt;br /&gt;
    fprintf('t = %.4f --&amp;gt; min = %.6f, max = %.6f\n', t, min(U), max(U));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
title('Principio del máximo en el segundo problema','Interpreter','latex');&lt;br /&gt;
xlabel('$x$','Interpreter','latex');&lt;br /&gt;
&lt;br /&gt;
ylabel('$u(x,t)$','Interpreter','latex');&lt;br /&gt;
legend('Location','best','Interpreter','latex');&lt;br /&gt;
hold off;&lt;br /&gt;
&lt;br /&gt;
%% ============================================================&lt;br /&gt;
%% EVOLUCION DE MAXIMOS Y MINIMOS&lt;br /&gt;
%% ============================================================&lt;br /&gt;
&lt;br /&gt;
tgrid = linspace(0.005,0.5,60);&lt;br /&gt;
&lt;br /&gt;
max1 = zeros(size(tgrid));&lt;br /&gt;
min1 = zeros(size(tgrid));&lt;br /&gt;
max2 = zeros(size(tgrid));&lt;br /&gt;
min2 = zeros(size(tgrid));&lt;br /&gt;
&lt;br /&gt;
for n = 1:length(tgrid)&lt;br /&gt;
    t = tgrid(n);&lt;br /&gt;
&lt;br /&gt;
    % Caso 1&lt;br /&gt;
    Z1 = x(:) - y1(:).';&lt;br /&gt;
    U1 = trapz(y1, Phi(Z1,t), 2).';&lt;br /&gt;
    max1(n) = max(U1);&lt;br /&gt;
    min1(n) = min(U1);&lt;br /&gt;
&lt;br /&gt;
    % Caso 2&lt;br /&gt;
    Z2 = x(:) - y2(:).';&lt;br /&gt;
    U2 = trapz(y2, Phi(Z2,t).*exp(-(y2.^2)), 2).';&lt;br /&gt;
    max2(n) = max(U2);&lt;br /&gt;
    min2(n) = min(U2);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
figure('Name','Evolucion de maximos y minimos');&lt;br /&gt;
&lt;br /&gt;
subplot(1,2,1)&lt;br /&gt;
plot(tgrid,max1,'LineWidth',1.8); hold on; grid on;&lt;br /&gt;
plot(tgrid,min1,'LineWidth',1.8);&lt;br /&gt;
title('Caso 1: máximos y mínimos','Interpreter','latex');&lt;br /&gt;
xlabel('$t$','Interpreter','latex');&lt;br /&gt;
ylabel('valor','Interpreter','latex');&lt;br /&gt;
legend({'$\max u(\cdot,t)$','$\min u(\cdot,t)$'},'Interpreter','latex','Location','best');&lt;br /&gt;
&lt;br /&gt;
subplot(1,2,2)&lt;br /&gt;
plot(tgrid,max2,'LineWidth',1.8); hold on; grid on;&lt;br /&gt;
plot(tgrid,min2,'LineWidth',1.8);&lt;br /&gt;
title('Caso 2: máximos y mínimos','Interpreter','latex');&lt;br /&gt;
xlabel('$t$','Interpreter','latex');&lt;br /&gt;
ylabel('valor','Interpreter','latex');&lt;br /&gt;
legend({'$\max u(\cdot,t)$','$\min u(\cdot,t)$'},'Interpreter','latex','Location','best');&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
====Decaimiento y principio del máximo Dirichlet====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
clear; clc; close all;&lt;br /&gt;
&lt;br /&gt;
%% ============================================================&lt;br /&gt;
%  ECUACION DEL CALOR 1D CON DIRICHLET&lt;br /&gt;
%&lt;br /&gt;
%    u_t - u_xx = 0,     x in (-6,6), t&amp;gt;0&lt;br /&gt;
%    u(-6,t) = 0,        u(6,t) = 0&lt;br /&gt;
%    u(x,0) = 1_{[-1,1]}(x)&lt;br /&gt;
%&lt;br /&gt;
%  Este script:&lt;br /&gt;
%   1) Resuelve el problema&lt;br /&gt;
%   2) Grafica u(x_i,t) en puntos fijos (decaimiento temporal)&lt;br /&gt;
%   3) Muestra la superficie 3D u(x,t) (principio del maximo)&lt;br /&gt;
%   4) Grafica perfiles espaciales x -&amp;gt; u(x,t) para tiempos fijos&lt;br /&gt;
%% ============================================================&lt;br /&gt;
&lt;br /&gt;
%% Parametros del dominio&lt;br /&gt;
a = -6;&lt;br /&gt;
b = 6;&lt;br /&gt;
Nx = 401;                      % nodos espaciales totales&lt;br /&gt;
x = linspace(a,b,Nx)';         % columna&lt;br /&gt;
dx = x(2)-x(1);&lt;br /&gt;
&lt;br /&gt;
%% Parametros temporales&lt;br /&gt;
Tmax = 8;                      % tiempo final&lt;br /&gt;
Nt = 300;                      % numero de tiempos para guardar&lt;br /&gt;
tspan = linspace(0,Tmax,Nt);&lt;br /&gt;
&lt;br /&gt;
%% Condicion inicial: 1_{[-1,1]}(x)&lt;br /&gt;
u0 = double(abs(x) &amp;lt;= 1);&lt;br /&gt;
&lt;br /&gt;
% Compatibilidad con Dirichlet en bordes&lt;br /&gt;
u0(1) = 0;&lt;br /&gt;
u0(end) = 0;&lt;br /&gt;
&lt;br /&gt;
u0_max = max(u0);&lt;br /&gt;
u0_min = min(u0);&lt;br /&gt;
&lt;br /&gt;
fprintf('Maximo inicial = %.6f\n', u0_max);&lt;br /&gt;
fprintf('Minimo inicial = %.6f\n', u0_min);&lt;br /&gt;
&lt;br /&gt;
%% ------------------------------------------------------------&lt;br /&gt;
%  Discretizacion espacial&lt;br /&gt;
%  Solo resolvemos en nodos interiores&lt;br /&gt;
%% ------------------------------------------------------------&lt;br /&gt;
Nint = Nx - 2;                 % numero de nodos interiores&lt;br /&gt;
xint = x(2:end-1);&lt;br /&gt;
u0int = u0(2:end-1);&lt;br /&gt;
&lt;br /&gt;
e = ones(Nint,1);&lt;br /&gt;
A = spdiags([e -2*e e], -1:1, Nint, Nint) / dx^2;&lt;br /&gt;
&lt;br /&gt;
%% ------------------------------------------------------------&lt;br /&gt;
%  Sistema semidiscreto:&lt;br /&gt;
%      U_t = A U&lt;br /&gt;
%% ------------------------------------------------------------&lt;br /&gt;
f = @(t,u) A*u;&lt;br /&gt;
&lt;br /&gt;
% Solver rigido adecuado para difusion&lt;br /&gt;
[t,Uint] = ode15s(f, tspan, u0int);&lt;br /&gt;
&lt;br /&gt;
%% Reconstruccion de la solucion completa incluyendo bordes&lt;br /&gt;
% Ufull(j,i) = u(x_i, t_j)&lt;br /&gt;
Ufull = zeros(length(t), Nx);&lt;br /&gt;
Ufull(:,2:end-1) = Uint;&lt;br /&gt;
Ufull(:,1) = 0;&lt;br /&gt;
Ufull(:,end) = 0;&lt;br /&gt;
&lt;br /&gt;
%% ------------------------------------------------------------&lt;br /&gt;
%  Comprobacion numerica del principio del maximo&lt;br /&gt;
%% ------------------------------------------------------------&lt;br /&gt;
Umax = max(Ufull(:));&lt;br /&gt;
Umin = min(Ufull(:));&lt;br /&gt;
&lt;br /&gt;
fprintf('Maximo global numerico de la solucion = %.6f\n', Umax);&lt;br /&gt;
fprintf('Minimo global numerico de la solucion = %.6f\n', Umin);&lt;br /&gt;
fprintf('Deberia cumplirse aproximadamente: 0 &amp;lt;= u(x,t) &amp;lt;= 1\n');&lt;br /&gt;
&lt;br /&gt;
%% ============================================================&lt;br /&gt;
%  1) DECAIMIENTO TEMPORAL EN PUNTOS FIJOS&lt;br /&gt;
%% ============================================================&lt;br /&gt;
obs_points = [0 0.5 1 2 3 4 5];&lt;br /&gt;
obs_idx = zeros(size(obs_points));&lt;br /&gt;
obs_real = zeros(size(obs_points));&lt;br /&gt;
&lt;br /&gt;
for k = 1:length(obs_points)&lt;br /&gt;
    [~, obs_idx(k)] = min(abs(x - obs_points(k)));&lt;br /&gt;
    obs_real(k) = x(obs_idx(k));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
figure;&lt;br /&gt;
hold on;&lt;br /&gt;
for k = 1:length(obs_points)&lt;br /&gt;
    plot(t, Ufull(:,obs_idx(k)), 'LineWidth', 1.6, ...&lt;br /&gt;
        'DisplayName', sprintf('x = %.2f', obs_real(k)));&lt;br /&gt;
end&lt;br /&gt;
xlabel('t');&lt;br /&gt;
ylabel('u(x,t)');&lt;br /&gt;
title('Decaimiento temporal en puntos fijos (Dirichlet)');&lt;br /&gt;
legend('Location','best');&lt;br /&gt;
grid on;&lt;br /&gt;
hold off;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%% ============================================================&lt;br /&gt;
%  3) PERFILES ESPACIALES x -&amp;gt; u(x,t) PARA TIEMPOS FIJOS&lt;br /&gt;
%% ============================================================&lt;br /&gt;
times_to_plot = [0 0.19 0.99 3.99 8];&lt;br /&gt;
&lt;br /&gt;
figure;&lt;br /&gt;
hold on;&lt;br /&gt;
for m = 1:length(times_to_plot)&lt;br /&gt;
    [~, j] = min(abs(t - times_to_plot(m)));&lt;br /&gt;
    plot(x, Ufull(j,:), 'LineWidth', 1.6, ...&lt;br /&gt;
        'DisplayName', sprintf('t = %.2f', t(j)));&lt;br /&gt;
end&lt;br /&gt;
xlabel('x');&lt;br /&gt;
ylabel('u(x,t)');&lt;br /&gt;
title('Perfiles espaciales para tiempos fijos');&lt;br /&gt;
legend('Location','best');&lt;br /&gt;
grid on;&lt;br /&gt;
hold off;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
====Decaimiento y principio del máximo Neumann====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
clear; clc; close all;&lt;br /&gt;
&lt;br /&gt;
%% Dominio espacial&lt;br /&gt;
L = 6;&lt;br /&gt;
Nx = 401;&lt;br /&gt;
x = linspace(-L, L, Nx)';&lt;br /&gt;
dx = x(2) - x(1);&lt;br /&gt;
&lt;br /&gt;
%% Tiempo&lt;br /&gt;
Tmax = 20;&lt;br /&gt;
Nt = 300;&lt;br /&gt;
tspan = linspace(0, Tmax, Nt);&lt;br /&gt;
&lt;br /&gt;
%% Condición inicial: 1_{[-1,1]}(x)&lt;br /&gt;
u0 = double(abs(x) &amp;lt;= 1);&lt;br /&gt;
&lt;br /&gt;
%% Media integral de la condición inicial&lt;br /&gt;
media = trapz(x, u0) / (2*L);&lt;br /&gt;
fprintf('Media integral numerica = %.8f\n', media);&lt;br /&gt;
fprintf('Media exacta            = %.8f\n', 1/6);&lt;br /&gt;
&lt;br /&gt;
%% Matriz del Laplaciano con Neumann homogéneas&lt;br /&gt;
e = ones(Nx,1);&lt;br /&gt;
A = spdiags([e -2*e e], -1:1, Nx, Nx);&lt;br /&gt;
&lt;br /&gt;
% Ajuste en bordes para Neumann: u_x = 0&lt;br /&gt;
A(1,1)   = -2;&lt;br /&gt;
A(1,2)   =  2;&lt;br /&gt;
A(end,end-1) = 2;&lt;br /&gt;
A(end,end)   = -2;&lt;br /&gt;
&lt;br /&gt;
A = A / dx^2;&lt;br /&gt;
&lt;br /&gt;
%% Resolver sistema semidiscreto U_t = A*U&lt;br /&gt;
% ode15s va bien para difusión&lt;br /&gt;
f = @(t,u) A*u;&lt;br /&gt;
[t,U] = ode15s(f, tspan, u0);&lt;br /&gt;
&lt;br /&gt;
% U sale como matriz Nt x Nx&lt;br /&gt;
% para acceder a u(x_i,t_j): U(j,i)&lt;br /&gt;
&lt;br /&gt;
%% Puntos de observación: desde 0 y alejándose&lt;br /&gt;
obs_points = [0 0.5 1 2 3 4 5];&lt;br /&gt;
obs_idx = zeros(size(obs_points));&lt;br /&gt;
obs_real = zeros(size(obs_points));&lt;br /&gt;
&lt;br /&gt;
for k = 1:length(obs_points)&lt;br /&gt;
    [~, obs_idx(k)] = min(abs(x - obs_points(k)));&lt;br /&gt;
    obs_real(k) = x(obs_idx(k));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% Figura 1: evolución temporal en puntos fijos&lt;br /&gt;
figure;&lt;br /&gt;
hold on;&lt;br /&gt;
for k = 1:length(obs_points)&lt;br /&gt;
    plot(t, U(:, obs_idx(k)), 'LineWidth', 1.5, ...&lt;br /&gt;
        'DisplayName', sprintf('x = %.2f', obs_real(k)));&lt;br /&gt;
end&lt;br /&gt;
yline(media, '--k', 'LineWidth', 2, 'DisplayName', 'media = 1/6');&lt;br /&gt;
xlabel('t');&lt;br /&gt;
ylabel('u(x,t)');&lt;br /&gt;
title('Decaimiento temporal en puntos fijos');&lt;br /&gt;
legend('Location','best');&lt;br /&gt;
grid on;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%% Figura 3: perfiles espaciales para tiempos concretos&lt;br /&gt;
times_to_plot = [0 0.2 1 5 20];&lt;br /&gt;
figure;&lt;br /&gt;
hold on;&lt;br /&gt;
for m = 1:length(times_to_plot)&lt;br /&gt;
    [~, j] = min(abs(t - times_to_plot(m)));&lt;br /&gt;
    plot(x, U(j,:), 'LineWidth', 1.5, ...&lt;br /&gt;
        'DisplayName', sprintf('t = %.2f', t(j)));&lt;br /&gt;
end&lt;br /&gt;
yline(media, '--k', 'LineWidth', 2, 'DisplayName', 'media = 1/6');&lt;br /&gt;
xlabel('x');&lt;br /&gt;
ylabel('u(x,t)');&lt;br /&gt;
title('Perfiles espaciales');&lt;br /&gt;
legend('Location','best');&lt;br /&gt;
grid on;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
[[Categoría:EDP]]&lt;br /&gt;
[[Categoría:EDP25/26]]&lt;/div&gt;</summary>
		<author><name>DiegoGR</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/wiki/Ecuaci%C3%B3n_del_Calor_(SAL)</id>
		<title>Ecuación del Calor (SAL)</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/wiki/Ecuaci%C3%B3n_del_Calor_(SAL)"/>
				<updated>2026-04-12T21:16:44Z</updated>
		
		<summary type="html">&lt;p&gt;Luis Zulueta: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ TrabajoED | Series de Fourier. Grupo SAL | [[:Categoría:EDP|EDP]]|[[:Categoría:EDP25/26|2025-26]] | Sergio Maccanin &lt;br /&gt;
&lt;br /&gt;
Ángela Marquet &lt;br /&gt;
&lt;br /&gt;
Luis Zulueta  }}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Ecuacion del calor.SAL.png|800px]]&lt;/div&gt;</summary>
		<author><name>Luis Zulueta</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/wiki/Ecuaci%C3%B3n_del_calor_(SAL)</id>
		<title>Ecuación del calor (SAL)</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/wiki/Ecuaci%C3%B3n_del_calor_(SAL)"/>
				<updated>2026-04-12T21:12:06Z</updated>
		
		<summary type="html">&lt;p&gt;Luis Zulueta: Página creada con «{{ TrabajoED | Ecuación del Calor. Grupo SAL | EDP|2025-26 | Sergio Maccanin   Ángela Marquet   Luis Zulueta  }}  Archivo:E...»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ TrabajoED | Ecuación del Calor. Grupo SAL | [[:Categoría:EDP|EDP]]|[[:Categoría:EDP25/26|2025-26]] | Sergio Maccanin &lt;br /&gt;
&lt;br /&gt;
Ángela Marquet &lt;br /&gt;
&lt;br /&gt;
Luis Zulueta  }}&lt;br /&gt;
&lt;br /&gt;
[[Archivo:EDP2 (1).pdf|miniaturadeimagen]]&lt;/div&gt;</summary>
		<author><name>Luis Zulueta</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/wiki/Ecuacion_del_calor_MAM</id>
		<title>Ecuacion del calor MAM</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/wiki/Ecuacion_del_calor_MAM"/>
				<updated>2026-04-12T20:19:14Z</updated>
		
		<summary type="html">&lt;p&gt;Mario Alonso: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ TrabajoED | Ecuación del calor. Grupo MAM| [[:Categoría:EDP|EDP]]|[[:Categoría:EDP25/26|2025-26]] | Mario ALonso Rodríguez&lt;br /&gt;
Adrián Moreno Nieto&lt;br /&gt;
&lt;br /&gt;
Matías Martínez Mancebo }}&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Ecuación del calor MAM.png||800px]]&lt;br /&gt;
[[Medio:Ecuación del calor MAM.pdf| PDF del póster]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Abajo se puede ver el código que se ha utilizado para conseguir las gráficas. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import numpy as np&lt;br /&gt;
from mpl_toolkits.mplot3d import Axes3D&lt;br /&gt;
&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
# Define the heat equation solution&lt;br /&gt;
def heat_solution(x, t):&lt;br /&gt;
    if t &amp;lt;= 0:&lt;br /&gt;
        return 0&lt;br /&gt;
    return (1 / np.sqrt(2 * t)) * np.exp(-x**2 / (4 * t))&lt;br /&gt;
&lt;br /&gt;
# Create grid&lt;br /&gt;
x = np.linspace(-5, 5, 100)&lt;br /&gt;
t = np.linspace(0.1, 2, 50)  # Avoid t=0&lt;br /&gt;
X, T = np.meshgrid(x, t)&lt;br /&gt;
Z = np.vectorize(heat_solution)(X, T)&lt;br /&gt;
&lt;br /&gt;
# Plot 3D surface&lt;br /&gt;
fig = plt.figure()&lt;br /&gt;
ax = fig.add_subplot(111, projection='3d')&lt;br /&gt;
ax.plot_surface(X, T, Z, cmap='viridis')&lt;br /&gt;
ax.set_xlabel('x')&lt;br /&gt;
ax.set_ylabel('t')&lt;br /&gt;
ax.set_zlabel('u(x,t)')&lt;br /&gt;
ax.set_title('Solución fundamental de la ecuación del calor')&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
# Solución fundamental correcta de la ecuación del calor&lt;br /&gt;
def G(x, t):&lt;br /&gt;
    return (1 / np.sqrt(4 * np.pi * t)) * np.exp(-x**2 / (4 * t))&lt;br /&gt;
&lt;br /&gt;
# Tiempos que queremos comparar&lt;br /&gt;
times = [0.05, 0.1, 0.2, 0.5, 1, 2]&lt;br /&gt;
&lt;br /&gt;
# Dominio espacial&lt;br /&gt;
x = np.linspace(-10, 10, 2000)&lt;br /&gt;
&lt;br /&gt;
# Crear una sola gráfica&lt;br /&gt;
plt.figure(figsize=(7, 5))&lt;br /&gt;
&lt;br /&gt;
# -------------------------&lt;br /&gt;
# Perfiles originales&lt;br /&gt;
# -------------------------&lt;br /&gt;
for t in times:&lt;br /&gt;
    plt.plot(x, G(x, t), label=f&amp;quot;t = {t}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
plt.title(&amp;quot;Solución fundamental para distintos tiempos&amp;quot;)&lt;br /&gt;
plt.xlabel(&amp;quot;x&amp;quot;)&lt;br /&gt;
plt.ylabel(&amp;quot;G(x,t)&amp;quot;)&lt;br /&gt;
plt.grid(True)&lt;br /&gt;
plt.legend()&lt;br /&gt;
&lt;br /&gt;
plt.tight_layout()&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Categoría:EDP]]&lt;br /&gt;
[[Categoría:EDP25/26]]&lt;/div&gt;</summary>
		<author><name>Mario Alonso</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/wiki/Ecuaci%C3%B3n_del_calor_MMA</id>
		<title>Ecuación del calor MMA</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/wiki/Ecuaci%C3%B3n_del_calor_MMA"/>
				<updated>2026-04-12T18:17:48Z</updated>
		
		<summary type="html">&lt;p&gt;Andrea Sánchez: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ TrabajoED | Ecuación del calor. Grupo MMA| [[:Categoría:EDP|EDP]]|[[:Categoría:EDP25/26|2025-26]] | Marta Tejedor &lt;br /&gt;
&lt;br /&gt;
María Romojaro&lt;br /&gt;
&lt;br /&gt;
Andrea Sánchez}}&lt;br /&gt;
&lt;br /&gt;
[[Archivo: foto MMA.jpeg||800px]]&lt;br /&gt;
&lt;br /&gt;
=== Dispersión de partículas ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
# Parámetros&lt;br /&gt;
np.random.seed(42)&lt;br /&gt;
n_particles = 400&lt;br /&gt;
times = [0.05, 0.4, 1.0]&lt;br /&gt;
&lt;br /&gt;
fig, axes = plt.subplots(1, 3, figsize=(12, 4))&lt;br /&gt;
&lt;br /&gt;
for ax, t in zip(axes, times):&lt;br /&gt;
    # Movimiento aleatorio (normal)&lt;br /&gt;
    x = np.random.normal(0, np.sqrt(t), n_particles)&lt;br /&gt;
    y = np.random.normal(0, np.sqrt(t), n_particles)&lt;br /&gt;
&lt;br /&gt;
    ax.scatter(x, y, s=10, alpha=0.7)&lt;br /&gt;
    ax.set_title(f&amp;quot;t = {t}&amp;quot;)&lt;br /&gt;
    ax.set_aspect(&amp;quot;equal&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    # Límites visuales&lt;br /&gt;
    ax.set_xlim(-4, 4)&lt;br /&gt;
    ax.set_ylim(-4, 4)&lt;br /&gt;
    ax.grid(True)&lt;br /&gt;
&lt;br /&gt;
fig.suptitle(&amp;quot;Dispersión de partículas&amp;quot;)&lt;br /&gt;
plt.tight_layout()&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Trayectorias de movimiento browniano ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
# Parámetros&lt;br /&gt;
np.random.seed(42)&lt;br /&gt;
T = 1&lt;br /&gt;
n_steps = 300&lt;br /&gt;
dt = T / n_steps&lt;br /&gt;
&lt;br /&gt;
t = np.linspace(0, T, n_steps + 1)&lt;br /&gt;
&lt;br /&gt;
plt.figure(figsize=(8, 5))&lt;br /&gt;
&lt;br /&gt;
# Varias trayectorias&lt;br /&gt;
for _ in range(12):&lt;br /&gt;
    increments = np.random.normal(0, np.sqrt(dt), n_steps)&lt;br /&gt;
    B = np.concatenate([[0], np.cumsum(increments)])&lt;br /&gt;
    plt.plot(t, B)&lt;br /&gt;
&lt;br /&gt;
plt.title(&amp;quot;Trayectorias de movimiento browniano&amp;quot;)&lt;br /&gt;
plt.xlabel(&amp;quot;tiempo&amp;quot;)&lt;br /&gt;
plt.ylabel(&amp;quot;posición&amp;quot;)&lt;br /&gt;
plt.grid(True)&lt;br /&gt;
&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Evolución de la densidad ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
# Dominio&lt;br /&gt;
x = np.linspace(-6, 6, 1000)&lt;br /&gt;
&lt;br /&gt;
# Distintos tiempos&lt;br /&gt;
times = [0.2, 0.8, 1.6, 5,50]&lt;br /&gt;
&lt;br /&gt;
plt.figure(figsize=(8, 5))&lt;br /&gt;
&lt;br /&gt;
for t in times:&lt;br /&gt;
    # Solución de la ecuación del calor (gaussiana)&lt;br /&gt;
    p = 1 / np.sqrt(2 * np.pi * t) * np.exp(-x**2 / (2 * t))&lt;br /&gt;
    plt.plot(x, p, label=f&amp;quot;t = {t}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
plt.title(&amp;quot;Evolución de la densidad&amp;quot;)&lt;br /&gt;
plt.xlabel(&amp;quot;x&amp;quot;)&lt;br /&gt;
plt.ylabel(&amp;quot;densidad&amp;quot;)&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True)&lt;br /&gt;
&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Evolución de la densidad con ruido blanco ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
# Dominio espacial&lt;br /&gt;
x = np.linspace(-6, 6, 500)&lt;br /&gt;
&lt;br /&gt;
# Parámetro de difusión&lt;br /&gt;
D = 1&lt;br /&gt;
&lt;br /&gt;
# Tiempos &lt;br /&gt;
times = [0.2, 0.8, 1.6]&lt;br /&gt;
&lt;br /&gt;
# Solución del calor&lt;br /&gt;
def u(x, t, D=1):&lt;br /&gt;
    return (1 / np.sqrt(4 * np.pi * D * t)) * np.exp(-x**2 / (4 * D * t))&lt;br /&gt;
&lt;br /&gt;
# Semilla &lt;br /&gt;
np.random.seed(4)&lt;br /&gt;
&lt;br /&gt;
plt.figure(figsize=(8,5))&lt;br /&gt;
&lt;br /&gt;
for t in times:&lt;br /&gt;
    u_det = u(x, t, D)&lt;br /&gt;
    &lt;br /&gt;
    # Ruido proporcional &lt;br /&gt;
    noise = 0.02 * np.random.randn(len(x))&lt;br /&gt;
    u_noise = u_det + noise&lt;br /&gt;
    &lt;br /&gt;
    plt.plot(x, u_noise, label=f&amp;quot;t = {t}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
plt.xlabel(&amp;quot;x&amp;quot;)&lt;br /&gt;
plt.ylabel(&amp;quot;densidad&amp;quot;)&lt;br /&gt;
plt.title(&amp;quot;Evolución de la densidad con ruido blanco&amp;quot;)&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True)&lt;br /&gt;
&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Categoría:EDP]]&lt;br /&gt;
[[Categoría:EDP25/26]]&lt;/div&gt;</summary>
		<author><name>Marta Tejedor</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/wiki/Ecuaci%C3%B3n_del_calor_JC</id>
		<title>Ecuación del calor JC</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/wiki/Ecuaci%C3%B3n_del_calor_JC"/>
				<updated>2026-04-12T16:16:22Z</updated>
		
		<summary type="html">&lt;p&gt;Javier Martínez Saiz: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ TrabajoED | Ecuación del calor. Grupo 6-A | [[:Categoría:EDP|EDP]]|[[:Categoría:EDP25/26|2025-26]] | Carlos Asensio &lt;br /&gt;
&lt;br /&gt;
Javier Martínez }}&lt;br /&gt;
&lt;br /&gt;
== Póster ==&lt;br /&gt;
[[Archivo:EDPS_POSTER_3.pdf]]&lt;br /&gt;
[[Archivo:EDPS_POSTER_4.jpg|center|800px]]&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
=CODIGO 1 =&lt;br /&gt;
&amp;lt;source lang: &amp;quot;Matlab line&amp;gt;&lt;br /&gt;
% Solución por medio de la Solución Fundamental &lt;br /&gt;
&lt;br /&gt;
clear all; close all; clc;&lt;br /&gt;
&lt;br /&gt;
% parámetros de la EDP&lt;br /&gt;
L = 1;                  &lt;br /&gt;
D = 1;                  &lt;br /&gt;
nx = 500;               &lt;br /&gt;
x = linspace(-L, L, nx);&lt;br /&gt;
t_evols = [0.01, 0.02, 0.05, 0.1, 0.2, 0.5, 1]; % Tiempos de observación&lt;br /&gt;
colores = jet(length(t_evols));&lt;br /&gt;
&lt;br /&gt;
figure('Color', 'w', 'Name', 'Comparativa Ecuación del Calor', 'Position', [50, 50, 1200, 800]);&lt;br /&gt;
&lt;br /&gt;
%CASO 1: Fuente Puntual&lt;br /&gt;
subplot(3, 1, 1); hold on;&lt;br /&gt;
for i = 1:length(t_evols)&lt;br /&gt;
    t = t_evols(i);&lt;br /&gt;
    % u(x,t) = Phi(x,t)&lt;br /&gt;
    u = (1 / sqrt(4 * pi * D * t)) * exp(-(x.^2) / (4 * D * t));&lt;br /&gt;
    plot(x, u, 'Color', colores(i,:), 'LineWidth', 2, 'DisplayName', ['t = ' num2str(t)]);&lt;br /&gt;
end&lt;br /&gt;
title('1. Evolución de la difusión con una fuente de calor en x=0', 'FontSize', 12);&lt;br /&gt;
ylabel('Temperatura'); legend('Location', 'northeast'); grid on;&lt;br /&gt;
ylim([0 6]); &lt;br /&gt;
&lt;br /&gt;
%CASO 2: Condición Inicial Senoidal&lt;br /&gt;
subplot(3, 1, 2); hold on;&lt;br /&gt;
% u(x,0) = sin(pi * x)&lt;br /&gt;
for i = 1:length(t_evols)&lt;br /&gt;
    t = t_evols(i);&lt;br /&gt;
    % Por propiedad de funciones propias: u = sin(k*x) * exp(-D*k^2*t)&lt;br /&gt;
    u = sin(pi * x) * exp(-D * pi^2 * t);&lt;br /&gt;
    plot(x, u, 'Color', colores(i,:), 'LineWidth', 2, 'DisplayName', ['t = ' num2str(t)]);&lt;br /&gt;
end&lt;br /&gt;
title('2. Evolución de la difusión con condición inicial sen(x)', 'FontSize', 12);&lt;br /&gt;
ylabel('Temperatura'); legend('Location', 'northeast'); grid on;&lt;br /&gt;
ylim([-1.2 1.2]);&lt;br /&gt;
&lt;br /&gt;
%CASO 3: Condición Inicial Aleatoria&lt;br /&gt;
subplot(3, 1, 3); hold on;&lt;br /&gt;
rng(10); &lt;br /&gt;
N_modos = 20;&lt;br /&gt;
A = randn(1, N_modos) ./ (1:N_modos); % Amplitudes aleatorias decrecientes&lt;br /&gt;
&lt;br /&gt;
for i = 1:length(t_evols)&lt;br /&gt;
    t = t_evols(i);&lt;br /&gt;
    u = zeros(size(x));&lt;br /&gt;
    for n = 1:N_modos&lt;br /&gt;
        u = u + A(n) * sin(n * pi * x / L) * exp(-D * (n * pi / L)^2 * t);&lt;br /&gt;
    end&lt;br /&gt;
    plot(x, u, 'Color', colores(i,:), 'LineWidth', 2, 'DisplayName', ['t = ' num2str(t)]);&lt;br /&gt;
end&lt;br /&gt;
title('3. Evolución de la difusión con condiciones iniciales aleatorias', 'FontSize', 12);&lt;br /&gt;
xlabel('Espacio (x)'); ylabel('Temperatura'); legend('Location', 'northeast'); grid on;&lt;br /&gt;
ylim([-1.5 1.5]);&lt;br /&gt;
&lt;br /&gt;
% Anotación global&lt;br /&gt;
sgtitle('Análisis de Difusión: Fuente de calor, función senoidal y funciones aleatorias', 'FontSize', 16, 'FontWeight', 'bold');&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=CODIGO 2=&lt;br /&gt;
&amp;lt;source lang: &amp;quot;Matlab&amp;quot; line&amp;gt;&lt;br /&gt;
% Visualización de la superficie de solución u(x,t)&lt;br /&gt;
&lt;br /&gt;
clear all; close all; clc;&lt;br /&gt;
&lt;br /&gt;
% Parámetros Globales&lt;br /&gt;
L = 1;              &lt;br /&gt;
T_final = 1;      &lt;br /&gt;
D = 1;             &lt;br /&gt;
nx = 100;          &lt;br /&gt;
nt = 100;           &lt;br /&gt;
&lt;br /&gt;
x = linspace(-L, L, nx);&lt;br /&gt;
t = linspace(0.01, T_final, nt);&lt;br /&gt;
[X, T] = meshgrid(x, t);&lt;br /&gt;
&lt;br /&gt;
figure('Color', 'w', 'Name', 'Evolución 3D: Solución Fundamental vs Perfiles', 'Position', [100, 100, 1200, 400]);&lt;br /&gt;
&lt;br /&gt;
%CASO 1: Punto Caliente&lt;br /&gt;
% u(x,t) = Phi(x,t)&lt;br /&gt;
U1 = (1 ./ sqrt(4 * pi * D * T)) .* exp(-(X.^2) ./ (4 * D * T));&lt;br /&gt;
&lt;br /&gt;
subplot(1, 3, 1);&lt;br /&gt;
surf(X, T, U1, 'EdgeColor', 'none');&lt;br /&gt;
colormap(hot); view(-30, 30);&lt;br /&gt;
title('1. Fuente Puntual (\Phi)', 'FontSize', 12);&lt;br /&gt;
xlabel('x'); ylabel('t'); zlabel('u');&lt;br /&gt;
grid on; axis tight;&lt;br /&gt;
&lt;br /&gt;
%CASO 2: Función seno&lt;br /&gt;
% u(x,0) = sin(pi*x) -&amp;gt; u(x,t) = sin(pi*x) * exp(-D*pi^2*t)&lt;br /&gt;
U2 = sin(pi * X) .* exp(-D * pi^2 * T);&lt;br /&gt;
&lt;br /&gt;
subplot(1, 3, 2);&lt;br /&gt;
surf(X, T, U2, 'EdgeColor', 'none');&lt;br /&gt;
colormap(hot); view(-30, 30);&lt;br /&gt;
title('2. Función seno', 'FontSize', 12);&lt;br /&gt;
xlabel('x'); ylabel('t'); zlabel('u');&lt;br /&gt;
grid on; axis tight;&lt;br /&gt;
&lt;br /&gt;
%CASO 3: Funciones aleatorias&lt;br /&gt;
rng(10); &lt;br /&gt;
N_modos = 15;&lt;br /&gt;
A = randn(1, N_modos) ./ (1:N_modos);&lt;br /&gt;
U3 = zeros(size(X));&lt;br /&gt;
for n = 1:N_modos&lt;br /&gt;
    U3 = U3 + A(n) * sin(n * pi * X / L) .* exp(-D * (n * pi / L)^2 * T);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
subplot(1, 3, 3);&lt;br /&gt;
surf(X, T, U3, 'EdgeColor', 'none');&lt;br /&gt;
colormap(hot); view(-30, 30);&lt;br /&gt;
title('3. Funciones aleatorias', 'FontSize', 12);&lt;br /&gt;
xlabel('x'); ylabel('t'); zlabel('u');&lt;br /&gt;
grid on; axis tight;&lt;br /&gt;
&lt;br /&gt;
sgtitle('Superficies de Solución u(x,t): Efecto de Regularización', 'FontSize', 16, 'FontWeight', 'bold');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=CODIGO 3 =&lt;br /&gt;
&amp;lt;source lang: &amp;quot;Matlab&amp;quot; line&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
from scipy.special import erfc&lt;br /&gt;
&lt;br /&gt;
# 1. Definición del dominio espacial (x &amp;gt; 0). Usamos un rango de 0 a 5.&lt;br /&gt;
x = np.linspace(0, 5, 1000)&lt;br /&gt;
&lt;br /&gt;
# 2. Definición de los instantes de tiempo muy pequeños para ver el comportamiento cerca de t=0&lt;br /&gt;
tiempos = [0.01, 0.1, 0.5, 1.0, 5.0]&lt;br /&gt;
&lt;br /&gt;
plt.figure(figsize=(10, 6))&lt;br /&gt;
&lt;br /&gt;
# 3. Cálculo y representación de la solución para cada tiempo&lt;br /&gt;
for t in tiempos:&lt;br /&gt;
    u = 1 + erfc(x / (2 * np.sqrt(t)))&lt;br /&gt;
    plt.plot(x, u, label=f't = {t}')&lt;br /&gt;
&lt;br /&gt;
# 4. Decoración de la gráfica para el póster&lt;br /&gt;
plt.title('Evolución Térmica en Semiespacio: $u(0,t)=2, u(x,0)=1$', fontsize=14)&lt;br /&gt;
plt.xlabel('Posición (x)', fontsize=12)&lt;br /&gt;
plt.ylabel('Temperatura (u)', fontsize=12)&lt;br /&gt;
&lt;br /&gt;
# Límites del Principio del Máximo&lt;br /&gt;
plt.axhline(2, color='red', linestyle='--', alpha=0.5, label='Frontera u=2')&lt;br /&gt;
plt.axhline(1, color='blue', linestyle='--', alpha=0.5, label='Dato inicial u=1')&lt;br /&gt;
&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True, which='both', linestyle='--', alpha=0.5)&lt;br /&gt;
plt.ylim(0.8, 2.2)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=CODIGO 4=&lt;br /&gt;
&amp;lt;source lang: &amp;quot;Matlab&amp;quot; line&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
def K(x, t, y=0):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Solución fundamental centrada en y.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    return (1 / np.sqrt(4 * np.pi * t)) * np.exp(-(x - y)**2 / (4 * t))&lt;br /&gt;
&lt;br /&gt;
x = np.linspace(-5, 5, 1000)&lt;br /&gt;
t = 0.1  # Fijamos un tiempo&lt;br /&gt;
&lt;br /&gt;
# Definimos tres centros y tres intensidades (coeficientes)&lt;br /&gt;
centros = [-2, 0, 1.5]&lt;br /&gt;
pesos = [0.8, 1.2, 0.5]&lt;br /&gt;
&lt;br /&gt;
plt.figure(figsize=(10, 6))&lt;br /&gt;
&lt;br /&gt;
# Dibujamos cada solución fundamental individual&lt;br /&gt;
u_total = np.zeros_like(x)&lt;br /&gt;
for y, c in zip(centros, pesos):&lt;br /&gt;
    u_i = c * K(x, t, y)&lt;br /&gt;
    u_total += u_i&lt;br /&gt;
    plt.plot(x, u_i, '--', alpha=0.6, label=f'Centrada en y={y} (peso {c})')&lt;br /&gt;
&lt;br /&gt;
# Dibujamos la combinación lineal (la suma)&lt;br /&gt;
plt.plot(x, u_total, 'k-', lw=2, label='Combinación Lineal (Suma)')&lt;br /&gt;
&lt;br /&gt;
plt.title('Superposición de Soluciones Fundamentales', fontsize=14)&lt;br /&gt;
plt.xlabel('Posición (x)')&lt;br /&gt;
plt.ylabel('Temperatura (u)')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True, alpha=0.3)&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=CODIGO 5=&lt;br /&gt;
&amp;lt;source lang: &amp;quot;Matlab&amp;quot; line&amp;gt;&lt;br /&gt;
%  Evolución de un bloque de calor u0 = 1[0,1]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
clear all; close all; clc;&lt;br /&gt;
&lt;br /&gt;
% Parámetros&lt;br /&gt;
D = 1;                         &lt;br /&gt;
t_vals = [0.001, 0.01, 0.1];    &lt;br /&gt;
x_grid = linspace(-1, 2, 400);  &lt;br /&gt;
y_int = linspace(0, 1, 1000);   &lt;br /&gt;
&lt;br /&gt;
figure('Color', 'w', 'Position', [100, 100, 850, 500]);&lt;br /&gt;
hold on;&lt;br /&gt;
&lt;br /&gt;
% Dibujar el dato inicial &lt;br /&gt;
plot(x_grid, (x_grid &amp;gt;= 0 &amp;amp; x_grid &amp;lt;= 1), 'k--', 'LineWidth', 1.5, 'DisplayName', 'u_0(x) (t=0)');&lt;br /&gt;
&lt;br /&gt;
% Cálculo por convolución numérica (Trapecio)&lt;br /&gt;
colores = [0.85 0.33 0.1; 0.93 0.69 0.13; 0 0.45 0.74]; &lt;br /&gt;
&lt;br /&gt;
for k = 1:length(t_vals)&lt;br /&gt;
    t = t_vals(k);&lt;br /&gt;
    u = zeros(size(x_grid));&lt;br /&gt;
    &lt;br /&gt;
    for i = 1:length(x_grid)&lt;br /&gt;
        K = (1 / sqrt(4 * pi * D * t)) * exp(-(x_grid(i) - y_int).^2 / (4 * D * t));&lt;br /&gt;
        u(i) = trapz(y_int, K);&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    plot(x_grid, u, 'Color', colores(k,:), 'LineWidth', 2.5, ...&lt;br /&gt;
        'DisplayName', ['t = ' num2str(t)]);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% Etiquetas&lt;br /&gt;
title('Difusión de un bloque unitario: $u(x,t) = (u_0 * K)(x,t)$', 'Interpreter', 'latex', 'FontSize', 14);&lt;br /&gt;
xlabel('Posición (x)'); ylabel('Temperatura (u)');&lt;br /&gt;
legend('Location', 'northeast');&lt;br /&gt;
grid on; axis tight;&lt;br /&gt;
ylim([-0.1 1.2]);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=CODIGO 6=&lt;br /&gt;
&amp;lt;source lang: &amp;quot;Matlab&amp;quot; line&amp;gt;&lt;br /&gt;
&lt;br /&gt;
% Solución Fundamental de la Ecuación del Calor en 2D&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
clear all; close all; clc;&lt;br /&gt;
&lt;br /&gt;
% Parámetros&lt;br /&gt;
D = 1; &lt;br /&gt;
t_vals = [0.1, 0.01, 0.001]; &lt;br /&gt;
[X1, X2] = meshgrid(linspace(-1, 1, 100)); % Dominio espacial [-1, 1]^2&lt;br /&gt;
&lt;br /&gt;
figure('Color', 'w', 'Position', [100, 100, 1300, 400]);&lt;br /&gt;
&lt;br /&gt;
for i = 1:length(t_vals)&lt;br /&gt;
    t = t_vals(i);&lt;br /&gt;
    &lt;br /&gt;
    %Cálculo de la solución fundamental en 2D&lt;br /&gt;
   &lt;br /&gt;
    R2 = X1.^2 + X2.^2;&lt;br /&gt;
    Phi = (1 / (4 * pi * D * t)) * exp(-R2 / (4 * D * t));&lt;br /&gt;
    &lt;br /&gt;
    %Gráfico&lt;br /&gt;
    subplot(1, 3, i);&lt;br /&gt;
    surf(X1, X2, Phi, 'EdgeColor', 'none');&lt;br /&gt;
    colormap(hot);&lt;br /&gt;
    view(3);&lt;br /&gt;
    grid on;&lt;br /&gt;
    &lt;br /&gt;
    title(['t = ' num2str(t)], 'FontSize', 12);&lt;br /&gt;
    xlabel('x_1'); ylabel('x_2'); zlabel('\Phi');&lt;br /&gt;
    axis tight;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
sgtitle('Evolución de la Solución Fundamental en 2D: Hacia la Singularidad', 'FontSize', 16);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=CODIGO 7 =&lt;br /&gt;
&amp;lt;source lang: &amp;quot;Matlab&amp;quot; line&amp;gt;&lt;br /&gt;
% Evolución de la Solución Fundamental en R^3&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
clear all; close all; clc;&lt;br /&gt;
&lt;br /&gt;
%Parámetros&lt;br /&gt;
D = 1; &lt;br /&gt;
t_vals = [0.1, 0.01, 0.001]; %&lt;br /&gt;
res = 35; &lt;br /&gt;
[X, Y, Z] = meshgrid(linspace(-1, 1, res));&lt;br /&gt;
R2 = X.^2 + Y.^2 + Z.^2;&lt;br /&gt;
&lt;br /&gt;
figure('Color', 'w', 'Position', [50, 50, 1500, 500]);&lt;br /&gt;
&lt;br /&gt;
for i = 1:length(t_vals)&lt;br /&gt;
    t = t_vals(i);&lt;br /&gt;
    &lt;br /&gt;
    % Cálculo de la solución fundamental en R^3&lt;br /&gt;
    Phi = (1 / (4 * pi * D * t)^(3/2)) * exp(-R2 / (4 * D * t));&lt;br /&gt;
    x_v = X(:); y_v = Y(:); z_v = Z(:); phi_v = Phi(:);&lt;br /&gt;
    &lt;br /&gt;
    threshold = max(phi_v) * 0.01; &lt;br /&gt;
    idx = phi_v &amp;gt; threshold;&lt;br /&gt;
    &lt;br /&gt;
    subplot(1, 3, i);&lt;br /&gt;
    &lt;br /&gt;
    % 3. Gráfico de dispersión 3D&lt;br /&gt;
    s = scatter3(x_v(idx), y_v(idx), z_v(idx), 20, phi_v(idx), 'filled');&lt;br /&gt;
    s.MarkerFaceAlpha = 'flat';&lt;br /&gt;
    alpha_vals = phi_v(idx) / max(phi_v(idx));&lt;br /&gt;
    s.AlphaData = alpha_vals;&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
    colormap(hot);&lt;br /&gt;
    colorbar;&lt;br /&gt;
    grid on; view(3);&lt;br /&gt;
    axis([-1 1 -1 1 -1 1]);&lt;br /&gt;
    &lt;br /&gt;
    title(['t = ' num2str(t) ' (Pico: ' num2str(max(phi_v), '%.1f') ')'], 'FontSize', 11);&lt;br /&gt;
    xlabel('x'); ylabel('y'); zlabel('z');&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
sgtitle('Evolución Volumétrica de la Solución Fundamental en $\mathbb{R}^3$', 'Interpreter', 'latex', 'FontSize', 16);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Categoría:EDP]]&lt;br /&gt;
[[Categoría:EDP25/26]]&lt;/div&gt;</summary>
		<author><name>Carlos Asensio</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/wiki/Ecuaci%C3%B3n_del_calor_DF</id>
		<title>Ecuación del calor DF</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/wiki/Ecuaci%C3%B3n_del_calor_DF"/>
				<updated>2026-04-12T15:35:04Z</updated>
		
		<summary type="html">&lt;p&gt;Fernando Madrid: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ TrabajoED | Series de Fourier. Grupo DF | [[:Categoría:EDP|EDP]]|[[:Categoría:EDP25/26|2025-26]] | Daniel Tormos&lt;br /&gt;
&lt;br /&gt;
Fernando Madrid&lt;br /&gt;
  }}&lt;br /&gt;
Este trabajo se centra en el estudio de la ecuación del calor para variedades de Riemann. En particular, se introduce el concepto del operador de Laplace-Beltrami y se hace el cálculo de la solución de la ecuación de difusión en &amp;lt;math&amp;gt;S^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Media:Ecuacion del calor poster.pdf|Poster ecuación del calor.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Categoría:EDP]]&lt;br /&gt;
[[Categoría:EDP25/26]]&lt;/div&gt;</summary>
		<author><name>Fernando Madrid</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/wiki/Ecuaci%C3%B3n_del_calor_RAJ</id>
		<title>Ecuación del calor RAJ</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/wiki/Ecuaci%C3%B3n_del_calor_RAJ"/>
				<updated>2026-04-12T11:17:59Z</updated>
		
		<summary type="html">&lt;p&gt;Alejandro.mates: Página creada con «{{ TrabajoED | Ecuación del calor. Grupo LÁJ| EDP|2025-26 | Luis García Suárez  Álvaro Moreno Cisneros  Juan Pérez Guerra...»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ TrabajoED | Ecuación del calor. Grupo LÁJ| [[:Categoría:EDP|EDP]]|[[:Categoría:EDP25/26|2025-26]] | Luis García Suárez&lt;br /&gt;
&lt;br /&gt;
Álvaro Moreno Cisneros&lt;br /&gt;
&lt;br /&gt;
Juan Pérez Guerra }}&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Ecuación del calor RAJ.png||800px]]&lt;br /&gt;
[[Medio:Ecuación del calor RAJ.pdf| PDF del póster]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Abajo se puede ver el código que se ha utilizado para conseguir las gráficas. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
import pandas as pd&lt;br /&gt;
from mpl_toolkits.mplot3d import Axes3D&lt;br /&gt;
&lt;br /&gt;
#Visualización unidimensional&lt;br /&gt;
&lt;br /&gt;
def nucleo_calor(x, t):&lt;br /&gt;
    return (1.0 / np.sqrt(4 * np.pi * t)) * np.exp(-(x**2) / (4 * t))&lt;br /&gt;
&lt;br /&gt;
def condicion_inicial_escalon(x):&lt;br /&gt;
    return np.where((x &amp;gt;= 0) &amp;amp; (x &amp;lt;= 1), 1.0, 0.0)&lt;br /&gt;
&lt;br /&gt;
def condicion_inicial_gaussiana(x):&lt;br /&gt;
    return np.exp(-x**2)&lt;br /&gt;
&lt;br /&gt;
def resolver_calor_integral(x_eval, t, u0_func, y_min=-10, y_max=10, dy=0.002):&lt;br /&gt;
    y = np.arange(y_min, y_max, dy)&lt;br /&gt;
    u0_y = u0_func(y)&lt;br /&gt;
&lt;br /&gt;
    u_vals = np.zeros_like(x_eval, dtype=float)&lt;br /&gt;
&lt;br /&gt;
    for i, x in enumerate(x_eval):&lt;br /&gt;
        integrando = nucleo_calor(x - y, t) * u0_y&lt;br /&gt;
        u_vals[i] = np.trapezoid(integrando, y)&lt;br /&gt;
&lt;br /&gt;
    return u_vals&lt;br /&gt;
&lt;br /&gt;
x_dominio = np.linspace(-2, 3, 500)&lt;br /&gt;
tiempos = [0.001, 0.01, 0.1, 0.5, 1]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
plt.figure(figsize=(10, 6))&lt;br /&gt;
plt.plot(x_dominio, condicion_inicial_escalon(x_dominio), 'k--', label='t = 0 (Dato Inicial)')&lt;br /&gt;
&lt;br /&gt;
for t in tiempos:&lt;br /&gt;
    u_t = resolver_calor_integral(x_dominio, t, condicion_inicial_escalon)&lt;br /&gt;
    plt.plot(x_dominio, u_t, label=f't = {t}')&lt;br /&gt;
&lt;br /&gt;
plt.title(r'Evolución de la Ecuación del Calor por Convolución en $\mathbb{R}$')&lt;br /&gt;
plt.xlabel('Posición x')&lt;br /&gt;
plt.ylabel('Temperatura u(x,t)')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True, alpha=0.3)&lt;br /&gt;
plt.tight_layout()&lt;br /&gt;
plt.show()&lt;br /&gt;
plt.close()&lt;br /&gt;
&lt;br /&gt;
x_vals = np.linspace(-2, 3, 100)&lt;br /&gt;
t_vals = np.linspace(0.001, 2, 100)&lt;br /&gt;
&lt;br /&gt;
X_mesh, T_mesh = np.meshgrid(x_vals, t_vals)&lt;br /&gt;
&lt;br /&gt;
y_int = np.linspace(0, 1, 300)&lt;br /&gt;
&lt;br /&gt;
diffs = X_mesh[:, :, np.newaxis] - y_int[np.newaxis, np.newaxis, :]&lt;br /&gt;
kernel_vals = nucleo_calor(diffs, T_mesh[:, :, np.newaxis])&lt;br /&gt;
u0_y = condicion_inicial_escalon(y_int)[np.newaxis, np.newaxis, :]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
U_solution = np.trapezoid(kernel_vals * u0_y, x=y_int, axis=2)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
fig = plt.figure(figsize=(9, 7))&lt;br /&gt;
ax = fig.add_subplot(111, projection='3d')&lt;br /&gt;
&lt;br /&gt;
surf = ax.plot_surface(X_mesh, T_mesh, U_solution, cmap='viridis',&lt;br /&gt;
                       edgecolor='none', alpha=0.9, antialiased=True)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
ax.set_title(r'Evolución Espacio-Temporal de la Ecuación del Calor por Convolución en $\mathbb{R}$')&lt;br /&gt;
ax.set_xlabel('Posición x')&lt;br /&gt;
ax.set_ylabel('Tiempo t')&lt;br /&gt;
ax.set_zlabel('Temperatura u(x,t)')&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
fig.colorbar(surf, ax=ax, shrink=0.5, aspect=10, label='Temperatura')&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
ax.view_init(elev=30, azim=-120)&lt;br /&gt;
&lt;br /&gt;
plt.tight_layout()&lt;br /&gt;
&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Velocidad Infinita de Propagación&lt;br /&gt;
&lt;br /&gt;
x_lejos = np.linspace(1.5, 10, 300)&lt;br /&gt;
&lt;br /&gt;
plt.figure(figsize=(10, 6))&lt;br /&gt;
for t in tiempos:&lt;br /&gt;
    u_t_lejos = resolver_calor_integral(x_lejos, t, condicion_inicial_escalon)&lt;br /&gt;
    plt.plot(x_lejos, u_t_lejos + 1e-300, label=f't = {t}')&lt;br /&gt;
&lt;br /&gt;
plt.yscale('log')&lt;br /&gt;
plt.title('Velocidad Infinita de Propagación')&lt;br /&gt;
plt.xlabel('Posición x')&lt;br /&gt;
plt.ylabel('Temperatura u(x,t) - Escala Logarítmica')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True, which=&amp;quot;both&amp;quot;, ls=&amp;quot;--&amp;quot;, alpha=0.5)&lt;br /&gt;
plt.tight_layout()&lt;br /&gt;
plt.show()&lt;br /&gt;
plt.close()&lt;br /&gt;
&lt;br /&gt;
puntos_obs = [-1.0, -0.1, 0.5, 1.1, 2.0]&lt;br /&gt;
tabla_datos = {'Posición (x)': puntos_obs, 'u(x, t=0)': [0.0, 0.0, 1.0, 0.0, 0.0]}&lt;br /&gt;
&lt;br /&gt;
for t in tiempos:&lt;br /&gt;
    valores = resolver_calor_integral(np.array(puntos_obs), t, condicion_inicial_escalon)&lt;br /&gt;
    tabla_datos[f't={t}'] = valores&lt;br /&gt;
&lt;br /&gt;
df = pd.DataFrame(tabla_datos)&lt;br /&gt;
print(&amp;quot;\n--- Tabla de Propagación ---&amp;quot;)&lt;br /&gt;
print(df.to_string(index=False))&lt;br /&gt;
df.to_csv('tabla_propagacion.csv', index=False)&lt;br /&gt;
&lt;br /&gt;
#Comparación del decaimiento&lt;br /&gt;
&lt;br /&gt;
def max_R_t(t):&lt;br /&gt;
    y = np.linspace(-5, 6, 2000)&lt;br /&gt;
    integrando = nucleo_calor(0.5 - y, t) * condicion_inicial_escalon(y)&lt;br /&gt;
    return np.trapezoid(integrando, y)&lt;br /&gt;
&lt;br /&gt;
def max_acotado_t(t, L=5.0, X_centro=0.5, terms=50):&lt;br /&gt;
    val = 0&lt;br /&gt;
    for n in range(1, terms + 1):&lt;br /&gt;
        bn = (2.0 / (n * np.pi)) * (1 - np.cos(n * np.pi * 1.0 / L))&lt;br /&gt;
        val += bn * np.exp(-((n * np.pi / L)**2) * t) * np.sin(n * np.pi * X_centro / L)&lt;br /&gt;
    return val&lt;br /&gt;
&lt;br /&gt;
def norm_L2_R_t(t):&lt;br /&gt;
    x_vals = np.linspace(-15, 15, 1000)&lt;br /&gt;
    y_vals = np.linspace(-1, 2, 400)&lt;br /&gt;
&lt;br /&gt;
    X, Y = np.meshgrid(x_vals, y_vals)&lt;br /&gt;
    K = nucleo_calor(X - Y, t)&lt;br /&gt;
    u0 = condicion_inicial_escalon(Y)&lt;br /&gt;
&lt;br /&gt;
    u_vals = np.trapezoid(K * u0, x=y_vals, axis=0)&lt;br /&gt;
&lt;br /&gt;
    integral_u2 = np.trapezoid(u_vals**2, x=x_vals)&lt;br /&gt;
    return np.sqrt(integral_u2)&lt;br /&gt;
&lt;br /&gt;
def norm_L2_acotado_t(t, L=5.0, terms=50):&lt;br /&gt;
    norm_cuadrado = 0&lt;br /&gt;
    for n in range(1, terms + 1):&lt;br /&gt;
        bn = (2.0 / (n * np.pi)) * (1 - np.cos(n * np.pi * 1.0 / L))&lt;br /&gt;
        lambda_n = (n * np.pi / L)**2&lt;br /&gt;
        norm_cuadrado += (bn**2) * np.exp(-2 * lambda_n * t)&lt;br /&gt;
    return np.sqrt((L / 2.0) * norm_cuadrado)&lt;br /&gt;
&lt;br /&gt;
tiempos = np.linspace(0.1, 50, 100)&lt;br /&gt;
max_R = [max_R_t(t) for t in tiempos]&lt;br /&gt;
max_acotado = [max_acotado_t(t) for t in tiempos]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
plt.figure(figsize=(9, 6))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
plt.plot(tiempos, max_R, label=r'Dominio $\mathbb{R}$ (Decaimiento $t^{-1/2}$)', color='blue', lw=2)&lt;br /&gt;
plt.plot(tiempos, max_acotado, label=r'Dominio Acotado (Decaimiento $e^{-\lambda_1 t}$)', color='red', lw=2)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
plt.yscale('log')&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
plt.title('Comparativa de Decaimiento de la Temperatura Máxima')&lt;br /&gt;
plt.xlabel('Tiempo t')&lt;br /&gt;
plt.ylabel('Temperatura Máxima - Escala Logarítmica')&lt;br /&gt;
plt.grid(True, which=&amp;quot;both&amp;quot;, ls=&amp;quot;--&amp;quot;, alpha=0.5)&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.tight_layout()&lt;br /&gt;
&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
tiempos = np.linspace(0.1, 50, 100)&lt;br /&gt;
norma_R = [norm_L2_R_t(t) for t in tiempos]&lt;br /&gt;
norma_acotado = [norm_L2_acotado_t(t) for t in tiempos]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
plt.figure(figsize=(9, 6))&lt;br /&gt;
&lt;br /&gt;
plt.plot(tiempos, norma_R, label=r'Dominio $\mathbb{R}$ (Decaimiento $t^{-1/4}$)', color='blue', lw=2)&lt;br /&gt;
plt.plot(tiempos, norma_acotado, label=r'Dominio Acotado (Decaimiento $e^{-\lambda_1 t}$)', color='red', lw=2)&lt;br /&gt;
&lt;br /&gt;
plt.yscale('log')&lt;br /&gt;
plt.title('Comparativa de Decaimiento en Norma $L^2$')&lt;br /&gt;
plt.xlabel('Tiempo t')&lt;br /&gt;
plt.ylabel('Norma $L^2$ - Escala Logarítmica')&lt;br /&gt;
plt.grid(True, which=&amp;quot;both&amp;quot;, ls=&amp;quot;--&amp;quot;, alpha=0.5)&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.tight_layout()&lt;br /&gt;
&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Visualización del Caso bidimensional&lt;br /&gt;
&lt;br /&gt;
def nucleo_calor_2d(x, y, t):&lt;br /&gt;
    return (1.0 / (4 * np.pi * t)) * np.exp(-(x**2 + y**2) / (4 * t))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def u0_gaussiana_2d(x, y):&lt;br /&gt;
    return np.exp(-(x**2 + y**2))&lt;br /&gt;
&lt;br /&gt;
def u0_escalon_2d(x, y):&lt;br /&gt;
    return np.where((np.abs(x) &amp;lt;= 0.5) &amp;amp; (np.abs(y) &amp;lt;= 0.5), 1.0, 0.0)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def resolver_calor_convolucion_2d_trapecio(X, Y, t, u0_func,&lt;br /&gt;
                                           xi_min=-2, xi_max=2,&lt;br /&gt;
                                           eta_min=-2, eta_max=2,&lt;br /&gt;
                                           dxi=0.05, deta=0.05):&lt;br /&gt;
&lt;br /&gt;
    xi = np.arange(xi_min, xi_max, dxi)&lt;br /&gt;
    eta = np.arange(eta_min, eta_max, deta)&lt;br /&gt;
    XI, ETA = np.meshgrid(xi, eta)&lt;br /&gt;
&lt;br /&gt;
    u0_vals = u0_func(XI, ETA)&lt;br /&gt;
&lt;br /&gt;
    Z = np.zeros_like(X)&lt;br /&gt;
&lt;br /&gt;
    for i in range(X.shape[0]):&lt;br /&gt;
        for j in range(X.shape[1]):&lt;br /&gt;
&lt;br /&gt;
            kernel = nucleo_calor_2d(X[i, j] - XI, Y[i, j] - ETA, t)&lt;br /&gt;
            integrando = kernel * u0_vals&lt;br /&gt;
&lt;br /&gt;
            integral_eta = np.trapezoid(integrando, eta, axis=0)&lt;br /&gt;
            integral_total = np.trapezoid(integral_eta, xi)&lt;br /&gt;
&lt;br /&gt;
            Z[i, j] = integral_total&lt;br /&gt;
&lt;br /&gt;
    return Z&lt;br /&gt;
&lt;br /&gt;
x_vals = np.linspace(-1, 1, 100)&lt;br /&gt;
y_vals = np.linspace(-1, 1, 100)&lt;br /&gt;
X, Y = np.meshgrid(x_vals, y_vals)&lt;br /&gt;
&lt;br /&gt;
tiempos = [0.01, 0.1, 1]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
fig = plt.figure(figsize=(18, 8))&lt;br /&gt;
&lt;br /&gt;
for i, t in enumerate(tiempos):&lt;br /&gt;
&lt;br /&gt;
    L = 5 * np.sqrt(t)&lt;br /&gt;
&lt;br /&gt;
    Z = resolver_calor_convolucion_2d_trapecio(&lt;br /&gt;
        X, Y, t,&lt;br /&gt;
        u0_gaussiana_2d,&lt;br /&gt;
        xi_min=-L, xi_max=L,&lt;br /&gt;
        eta_min=-L, eta_max=L,&lt;br /&gt;
        dxi=0.05, deta=0.05&lt;br /&gt;
    )&lt;br /&gt;
&lt;br /&gt;
    ax = fig.add_subplot(1, 3, i+1, projection='3d')&lt;br /&gt;
&lt;br /&gt;
    surf = ax.plot_surface(X, Y, Z, cmap='inferno', edgecolor='none', alpha=0.9)&lt;br /&gt;
&lt;br /&gt;
    ax.set_title(f'Tiempo t = {t}', fontsize=12)&lt;br /&gt;
    ax.set_xlabel('$x_1$', fontsize=14)&lt;br /&gt;
    ax.set_ylabel('$x_2$', fontsize=14)&lt;br /&gt;
    ax.set_zlabel('$u(x,t)$', fontsize=14)&lt;br /&gt;
&lt;br /&gt;
    ax.tick_params(axis='x', labelsize=12)&lt;br /&gt;
    ax.tick_params(axis='y', labelsize=12)&lt;br /&gt;
    ax.tick_params(axis='z', labelsize=12)&lt;br /&gt;
&lt;br /&gt;
    ax.view_init(elev=25, azim=-45)&lt;br /&gt;
&lt;br /&gt;
plt.suptitle(r'Solución por Convolución de la Ecuación del Calor en $\mathbb{R}^2$', fontsize=20, y=0.98)&lt;br /&gt;
plt.tight_layout(rect=[0, 0.03, 1, 0.95], w_pad=4.0)&lt;br /&gt;
&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Categoría:EDP]]&lt;br /&gt;
[[Categoría:EDP25/26]]&lt;/div&gt;</summary>
		<author><name>Alejandro.mates</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/wiki/Ecuaci%C3%B3n_del_calor_PNL</id>
		<title>Ecuación del calor PNL</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/wiki/Ecuaci%C3%B3n_del_calor_PNL"/>
				<updated>2026-04-12T10:17:51Z</updated>
		
		<summary type="html">&lt;p&gt;Noe.rico: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ TrabajoED | Ecuación del calor. Grupo PNL | [[:Categoría:EDP|EDP]]|[[:Categoría:EDP25/26|2025-26]] | Paula León&lt;br /&gt;
&lt;br /&gt;
Noé Rico&lt;br /&gt;
&lt;br /&gt;
Leo Zambrano  }}&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Poster_PNL2.png||900px]]&lt;br /&gt;
[[Archivo:Poster_PNL2.pdf]]&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
=SOLUCIÓN DEL SISTEMA INICIAL=&lt;br /&gt;
El primer código para visualizar la solución del sistema inicial es el siguiente:&lt;br /&gt;
&amp;lt;source lang: &amp;quot;Matlab&amp;quot; line&amp;gt;&lt;br /&gt;
&lt;br /&gt;
% Parametros&lt;br /&gt;
x = linspace(0, 1, 1000);    % Mallado espacial&lt;br /&gt;
t = linspace(0, 1, 1000);    % Mallado temporal&lt;br /&gt;
[X, T] = meshgrid(x, t);    % Malla 2D&lt;br /&gt;
&lt;br /&gt;
% Solución estacionaria&lt;br /&gt;
v = 9*X + 1;&lt;br /&gt;
&lt;br /&gt;
% Primeros terminos de Fourier&lt;br /&gt;
N = 10;                     % Número de términos&lt;br /&gt;
w = zeros(size(X));&lt;br /&gt;
&lt;br /&gt;
for n = 1:N&lt;br /&gt;
    cn = 18 / (n * pi);&lt;br /&gt;
    wn = cn * sin(n * pi .* X) .* exp(-(n * pi)^2 .* T);&lt;br /&gt;
    w = w + wn;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% Solución tras el cambio&lt;br /&gt;
u = w + v;&lt;br /&gt;
&lt;br /&gt;
% Gráfica&lt;br /&gt;
figure;&lt;br /&gt;
surf(X, T, u, 'EdgeColor', 'none');&lt;br /&gt;
xlabel('x');&lt;br /&gt;
ylabel('t');&lt;br /&gt;
zlabel('u(x,t)');&lt;br /&gt;
title('Solución de la ecuación del calor: u(x,t) con primeros 10 términos');&lt;br /&gt;
colormap('jet');&lt;br /&gt;
colorbar;&lt;br /&gt;
view(45, 30);   &lt;br /&gt;
grid on;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=FLUJO EN LOS EXTREMOS DEL SI=&lt;br /&gt;
El código para observar el flujo en los extremos es:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang: &amp;quot;Matlab&amp;quot; line&amp;gt;&lt;br /&gt;
&lt;br /&gt;
% Parámetros&lt;br /&gt;
t = linspace(1e-16, 1, 1000);   % tiempo, evitando t=0 exacto&lt;br /&gt;
N = 10;                         % número de términos&lt;br /&gt;
&lt;br /&gt;
% Inicializar flujos&lt;br /&gt;
Phi0 = -9 * ones(size(t));&lt;br /&gt;
Phi1 = -9 * ones(size(t));&lt;br /&gt;
&lt;br /&gt;
% Sumar los N primeros términos&lt;br /&gt;
for n = 1:N&lt;br /&gt;
    Phi0 = Phi0 - 18 * exp(-(n*pi)^2 .* t);&lt;br /&gt;
    Phi1 = Phi1 - 18 * (-1)^n * exp(-(n*pi)^2 .* t);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% Gráfica&lt;br /&gt;
figure;&lt;br /&gt;
plot(t, Phi0, 'b-', 'LineWidth', 1.5); hold on;&lt;br /&gt;
plot(t, Phi1, 'r-', 'LineWidth', 1.5);&lt;br /&gt;
xlabel('tiempo t');&lt;br /&gt;
ylabel('Flujo de calor Φ(x,t)');&lt;br /&gt;
legend('Φ(0,t) (extremo izquierdo)', 'Φ(1,t) (extremo derecho)', 'Location', 'best');&lt;br /&gt;
title('Flujo de calor en los extremos de la varilla');&lt;br /&gt;
grid on;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=CAMBIO DE COEFICIENTE DE DIFUSIÓN=&lt;br /&gt;
El código utilizado para la solución con coeficiente de difusión 0.5 y la comparación con el coeficiente de difusión 1 es el siguiente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang: &amp;quot;Matlab&amp;quot; line&amp;gt;&lt;br /&gt;
&lt;br /&gt;
% Parámetros&lt;br /&gt;
x = linspace(0, 1, 1000);      % mallado espacial&lt;br /&gt;
t = linspace(0, 1, 1000);      % mallado temporal (incluye t=0)&lt;br /&gt;
[X, T] = meshgrid(x, t);      % malla 2D&lt;br /&gt;
&lt;br /&gt;
% Solución estacionaria &lt;br /&gt;
v = 9*X + 1;                  &lt;br /&gt;
&lt;br /&gt;
% Número de términos de la serie&lt;br /&gt;
N = 10;&lt;br /&gt;
&lt;br /&gt;
% Coeficientes c_n &lt;br /&gt;
c = zeros(1, N);&lt;br /&gt;
for n = 1:N&lt;br /&gt;
    c(n) = 18 / (n * pi);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% 1. Solución para k = 0.5&lt;br /&gt;
k1 = 0.5;&lt;br /&gt;
w_k05 = zeros(size(X));&lt;br /&gt;
for n = 1:N&lt;br /&gt;
    wn = c(n) * sin(n*pi*X) .* exp(-k1 * (n*pi)^2 .* T);&lt;br /&gt;
    w_k05 = w_k05 + wn;&lt;br /&gt;
end&lt;br /&gt;
u_k05 = v + w_k05;&lt;br /&gt;
&lt;br /&gt;
% Gráfica 3D para k=0.5&lt;br /&gt;
figure;&lt;br /&gt;
surf(X, T, u_k05, 'EdgeColor', 'none');&lt;br /&gt;
xlabel('x'); ylabel('t'); zlabel('u(x,t)');&lt;br /&gt;
title('Solución con conductividad k = 0.5 (primeros 10 términos)');&lt;br /&gt;
colormap('jet'); colorbar; grid on;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
% 2. Diferencia u(1/2,t)-uest(1/2) para ambos k&lt;br /&gt;
% Punto medio x=0.5&lt;br /&gt;
x_mid = 0.5;&lt;br /&gt;
% Para k=1 (original)&lt;br /&gt;
k_orig = 1;&lt;br /&gt;
w_diff_orig = zeros(size(t));&lt;br /&gt;
for n = 1:N&lt;br /&gt;
    wn = c(n) * sin(n*pi*x_mid) .* exp(-k_orig * (n*pi)^2 .* t);&lt;br /&gt;
    w_diff_orig = w_diff_orig + wn;&lt;br /&gt;
end&lt;br /&gt;
% Para k=0.5&lt;br /&gt;
w_diff_k05 = zeros(size(t));&lt;br /&gt;
for n = 1:N&lt;br /&gt;
    wn = c(n) * sin(n*pi*x_mid) .* exp(-k1 * (n*pi)^2 .* t);&lt;br /&gt;
    w_diff_k05 = w_diff_k05 + wn;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% Valor estacionario en x=0.5&lt;br /&gt;
uest_mid = 9*x_mid + 1;   % = 5.5&lt;br /&gt;
% La diferencia es simplemente w(x=0.5,t)&lt;br /&gt;
diff_orig = w_diff_orig;&lt;br /&gt;
diff_k05 = w_diff_k05;&lt;br /&gt;
&lt;br /&gt;
% Gráfica comparativa&lt;br /&gt;
figure;&lt;br /&gt;
plot(t, diff_orig, 'b-', 'LineWidth', 1.5); hold on;&lt;br /&gt;
plot(t, diff_k05, 'r--', 'LineWidth', 1.5);&lt;br /&gt;
xlabel('tiempo t'); ylabel('u(0.5,t) - u_{est}(0.5)');&lt;br /&gt;
legend('k = 1', 'k = 0.5', 'Location', 'best');&lt;br /&gt;
title('Evolución de la diferencia respecto al estado estacionario en x = 0.5');&lt;br /&gt;
grid on;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=SOLUCIÓN CON CAMBIO EN LAS CONDICIONES INICIALES=&lt;br /&gt;
El código para visualizar la solución del sistema con las condiciones iniciales modificadas es:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang: &amp;quot;Matlab&amp;quot; line&amp;gt;&lt;br /&gt;
&lt;br /&gt;
% Parametros&lt;br /&gt;
x = linspace(0, 1, 1000);    % Mallado espacial&lt;br /&gt;
t = linspace(0, 1, 1000);    % Mallado temporal&lt;br /&gt;
[X, T] = meshgrid(x, t);    % Malla 2D&lt;br /&gt;
&lt;br /&gt;
% Solución estacionaria&lt;br /&gt;
v = 10;&lt;br /&gt;
&lt;br /&gt;
% Primeros terminos de Fourier&lt;br /&gt;
N = 10;                     % Número de términos&lt;br /&gt;
w = zeros(size(X));&lt;br /&gt;
&lt;br /&gt;
for n = 1:N &lt;br /&gt;
    cn = 20/(n*pi)*(cos(2*pi*n/3)-cos(pi*n/3));&lt;br /&gt;
    wn = cn * sin(n * pi .* X) .* exp(-(n * pi)^2 .* T);&lt;br /&gt;
    w = w + wn;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% Solución tras el cambio&lt;br /&gt;
u = w + v;&lt;br /&gt;
&lt;br /&gt;
% Gráfica&lt;br /&gt;
figure;&lt;br /&gt;
surf(X, T, u, 'EdgeColor', 'none');&lt;br /&gt;
xlabel('x');&lt;br /&gt;
ylabel('t');&lt;br /&gt;
zlabel('u(x,t)');&lt;br /&gt;
title('Solución de la ecuación del calor: u(x,t) con primeros 10 términos');&lt;br /&gt;
colormap('jet');&lt;br /&gt;
colorbar;&lt;br /&gt;
view(45, 30);   &lt;br /&gt;
grid on;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=FLUJO EN LOS EXTREMOS CON CAMBIO EN CONDICIONES INICIALES=&lt;br /&gt;
Para visualizar el flujo con las nuevas condiciones iniciales utilizamos el siguiente código:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang: &amp;quot;Matlab&amp;quot; line&amp;gt;&lt;br /&gt;
&lt;br /&gt;
% Parámetros&lt;br /&gt;
t = linspace(1e-16, 1, 1000);   % tiempo, evitando t=0 exacto&lt;br /&gt;
N = 10;                         % número de términos&lt;br /&gt;
&lt;br /&gt;
% Inicializar flujos&lt;br /&gt;
Phi0 = zeros(size(t));&lt;br /&gt;
Phi1 = zeros(size(t));&lt;br /&gt;
&lt;br /&gt;
% Sumar los N primeros términos&lt;br /&gt;
for n = 1:N&lt;br /&gt;
    Phi0 = Phi0 - 20 * (cos(2*pi*n/3)-cos(pi*n/3))* exp(-(n*pi)^2 .* t);&lt;br /&gt;
    Phi1 = Phi1 - 20 * (cos(2*pi*n/3)-cos(pi*n/3))*(-1)^n * exp(-(n*pi)^2 .* t);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% Gráfica&lt;br /&gt;
figure;&lt;br /&gt;
plot(t, Phi0, 'b-', 'LineWidth', 1.5); hold on;&lt;br /&gt;
plot(t, Phi1, 'r-', 'LineWidth', 1.5);&lt;br /&gt;
xlabel('tiempo t');&lt;br /&gt;
ylabel('Flujo de calor Φ(x,t)');&lt;br /&gt;
legend('Φ(0,t) (extremo izquierdo)', 'Φ(1,t) (extremo derecho)', 'Location', 'best');&lt;br /&gt;
title('Flujo de calor en los extremos de la varilla');&lt;br /&gt;
grid on;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=SOLUCIÓN CON CAMBIO EN LAS CONDICIONES FRONTERA=&lt;br /&gt;
El código para observar la solución con el sistema con distintas condiciones de frontera es:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang: &amp;quot;Matlab&amp;quot; line&amp;gt;&lt;br /&gt;
&lt;br /&gt;
% Parametros&lt;br /&gt;
x = linspace(0, 1, 1000);    % Mallado espacial&lt;br /&gt;
t = linspace(0, 1, 1000);    % Mallado temporal&lt;br /&gt;
[X, T] = meshgrid(x, t);    % Malla 2D&lt;br /&gt;
&lt;br /&gt;
% Solución estacionaria&lt;br /&gt;
v = 10;&lt;br /&gt;
&lt;br /&gt;
% Primeros terminos de Fourier&lt;br /&gt;
N = 10;                     % Número de términos&lt;br /&gt;
w = zeros(size(X));&lt;br /&gt;
&lt;br /&gt;
for n = 0:N &lt;br /&gt;
    cn = -40/((n+1/2)*pi)*sin((pi/12) + (n*pi/6)) * cos((pi/4) + (n*pi/2));&lt;br /&gt;
    wn = cn * cos((1/2 + n)*pi.*X).*exp(-((1/2+n)*pi)^2.*T);&lt;br /&gt;
    w = w + wn;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% Solución tras el cambio&lt;br /&gt;
u = w + v;&lt;br /&gt;
&lt;br /&gt;
% Gráfica&lt;br /&gt;
figure;&lt;br /&gt;
surf(X, T, u, 'EdgeColor', 'none');&lt;br /&gt;
xlabel('x');&lt;br /&gt;
ylabel('t');&lt;br /&gt;
zlabel('u(x,t)');&lt;br /&gt;
title('Solución de la ecuación del calor: u(x,t) con primeros 10 términos');&lt;br /&gt;
colormap('jet');&lt;br /&gt;
colorbar;&lt;br /&gt;
view(45, 30);   &lt;br /&gt;
grid on;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=FLUJO EN LOS EXTREMOS CON CAMBIO EN CONDICIONES FRONTERA=&lt;br /&gt;
Para ver el flujo en los extremos del problema con distintas condiciones de fronteras utilizamos el siguiente código:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang: &amp;quot;Matlab&amp;quot; line&amp;gt;&lt;br /&gt;
&lt;br /&gt;
% Parámetros&lt;br /&gt;
t = linspace(1e-16, 1, 1000);   % tiempo, evitando t=0 exacto&lt;br /&gt;
N = 10;                         % número de términos&lt;br /&gt;
&lt;br /&gt;
% Inicializar flujos&lt;br /&gt;
Phi0 = zeros(size(t));&lt;br /&gt;
Phi1 = zeros(size(t));&lt;br /&gt;
&lt;br /&gt;
% Sumar los N primeros términos&lt;br /&gt;
for n = 1:N&lt;br /&gt;
    Phi0 = Phi0 + 40*sin((pi/12) + (n*pi/6)) * cos((pi/4) + (n*pi/2)) * sin((1/2 + n)*pi.*0)*exp(-((1/2+n)*pi)^2.*t);&lt;br /&gt;
    Phi1 = Phi1 + 40*sin((pi/12) + (n*pi/6)) * cos((pi/4) + (n*pi/2)) * sin((1/2 + n)*pi)*exp(-((1/2+n)*pi)^2.*t);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% Gráfica&lt;br /&gt;
figure;&lt;br /&gt;
plot(t, Phi0, 'b-', 'LineWidth', 1.5); hold on;&lt;br /&gt;
plot(t, Phi1, 'r-', 'LineWidth', 1.5);&lt;br /&gt;
xlabel('tiempo t');&lt;br /&gt;
ylabel('Flujo de calor Φ(x,t)');&lt;br /&gt;
legend('Φ(0,t) (extremo izquierdo)', 'Φ(1,t) (extremo derecho)', 'Location', 'best');&lt;br /&gt;
title('Flujo de calor en los extremos de la varilla');&lt;br /&gt;
grid on;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=PRINCIPIO DE COMPARACIÓN=&lt;br /&gt;
El código para visualizar el principio de comparación es:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang: &amp;quot;Matlab&amp;quot; line&amp;gt;&lt;br /&gt;
&lt;br /&gt;
% Parámetros&lt;br /&gt;
x = linspace(0, 1, 1000);      % Mallado espacial&lt;br /&gt;
t = linspace(0, 1, 1000);      % Mallado temporal&lt;br /&gt;
[X, T] = meshgrid(x, t);       % Malla 2D&lt;br /&gt;
&lt;br /&gt;
% Solución estacionaria (cota inferior)&lt;br /&gt;
v = 9 * X + 1;                  % v(x,t) = 9x+1&lt;br /&gt;
&lt;br /&gt;
% Cota superior constante&lt;br /&gt;
z = 10 * ones(size(X));         % z(x,t) = 10&lt;br /&gt;
&lt;br /&gt;
% Cálculo de la solución u(x,t) del problema original&lt;br /&gt;
% u_t = u_xx, con u(0,t)=1, u(1,t)=10, u(x,0)=10&lt;br /&gt;
% La solución se escribe como u = v + w, donde w se obtiene por separación de variables&lt;br /&gt;
N = 1000;                         % Número de términos de Fourier&lt;br /&gt;
w = zeros(size(X));&lt;br /&gt;
&lt;br /&gt;
for n = 1:N&lt;br /&gt;
    cn = 18 / (n * pi);         % Coeficientes de la serie de Fourier de 10 - (9x+1) = 9(1-x)&lt;br /&gt;
    wn = cn * sin(n * pi .* X) .* exp(-(n * pi)^2 .* T);&lt;br /&gt;
    w = w + wn;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
u = v + w;                      % Solución completa&lt;br /&gt;
&lt;br /&gt;
% Gráfica 3D que muestra u(x,t) y las dos cotas&lt;br /&gt;
figure;&lt;br /&gt;
% Superficie de la solución&lt;br /&gt;
surf(X, T, u, 'EdgeColor', 'none', 'FaceAlpha', 0.8);&lt;br /&gt;
hold on;&lt;br /&gt;
% Cota inferior v(x,t) = 9x+1&lt;br /&gt;
surf(X, T, v, 'EdgeColor', 'none', 'FaceAlpha', 0.4, 'FaceColor', 'green');&lt;br /&gt;
% Cota superior z(x,t) = 10&lt;br /&gt;
surf(X, T, z, 'EdgeColor', 'none', 'FaceAlpha', 0.4, 'FaceColor', 'red');&lt;br /&gt;
&lt;br /&gt;
xlabel('x');&lt;br /&gt;
ylabel('t');&lt;br /&gt;
zlabel('u(x,t)');&lt;br /&gt;
title('Comparación: solución u(x,t) acotada entre 9x+1 (verde) y 10 (rojo)');&lt;br /&gt;
legend('u(x,t)', '9x+1 (cota inferior)', '10 (cota superior)', 'Location', 'best');&lt;br /&gt;
colormap('jet');&lt;br /&gt;
colorbar;&lt;br /&gt;
view(45, 30);   &lt;br /&gt;
grid on;&lt;br /&gt;
hold off;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Categoría:EDP]]&lt;br /&gt;
[[Categoría:EDP25/26]]&lt;/div&gt;</summary>
		<author><name>Noe.rico</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/wiki/Ecuaci%C3%B3n_del_Calor_Grupo_CCE</id>
		<title>Ecuación del Calor Grupo CCE</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/wiki/Ecuaci%C3%B3n_del_Calor_Grupo_CCE"/>
				<updated>2026-04-11T18:27:35Z</updated>
		
		<summary type="html">&lt;p&gt;Coloma de Lara: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ TrabajoED | Ecuación del Calor. Grupo CCE| [[:Categoría:EDP|EDP]]|[[:Categoría:EDP25/26|2025-26]] | Coloma de Lara&lt;br /&gt;
Carlos de Miguel  &lt;br /&gt;
&lt;br /&gt;
Elena Rodríguez }}&lt;br /&gt;
&lt;br /&gt;
[[Medio:PosterecuacioncalorCCE.pdf]]&lt;br /&gt;
&lt;br /&gt;
==Ilustrar  la solución fundamental de la ecuación del calor en dimensión 1.==&lt;br /&gt;
Primero vamos a ilustrar la solución fundamental de la ecuación del calor en dimensión &amp;lt;math&amp;gt; 1 &amp;lt;/math&amp;gt; , tomando &amp;lt;math&amp;gt;x\in [-1,1] &amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;t\in [10^{-2},1] &amp;lt;/math&amp;gt;. Recordamos que la solución fundamental de la ecuación del calor es :&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math display=&amp;quot;block&amp;quot;&amp;gt;\Phi(x,t) = \frac{1}{\sqrt{4\pi k t}} e^{-\frac{x^2}{4kt}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
donde &amp;lt;math&amp;gt; k &amp;lt;/math&amp;gt; es la constante de difusión térmica del material. Para ilustrarla vamos a suponer &amp;lt;math&amp;gt; k=1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%; border: none; background: transparent;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width: 65%; text-align: left; background: #f2f2f2;&amp;quot; | Implementación en MATLAB&lt;br /&gt;
! style=&amp;quot;width: 35%; text-align: center; background: #f2f2f2;&amp;quot; | Resultado Gráfico&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align: top;&amp;quot; |&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% Parámetros iniciales &lt;br /&gt;
k = 1; % Asumimos difusividad 1&lt;br /&gt;
x = linspace(-1, 1, 1000); &lt;br /&gt;
% Instantes de tiempo dentro del intervalo [10^-2, 1]&lt;br /&gt;
tiempos = [0.01, 0.05, 0.1, 0.5, 1]; &lt;br /&gt;
&lt;br /&gt;
figure;&lt;br /&gt;
hold on;&lt;br /&gt;
grid on;&lt;br /&gt;
colores = lines(length(tiempos)); &lt;br /&gt;
&lt;br /&gt;
% Calcular y dibujar la solución en cada instante de tiempo&lt;br /&gt;
for i = 1:length(tiempos)&lt;br /&gt;
    t = tiempos(i);&lt;br /&gt;
    &lt;br /&gt;
    % fórmula de la solución fundamental&lt;br /&gt;
    Phi = (1 / sqrt(4 * pi * k * t)) * exp(-(x.^2) / (4 * k * t));&lt;br /&gt;
    &lt;br /&gt;
    % dibujamos&lt;br /&gt;
    plot(x, Phi, 'LineWidth', 2, 'Color', colores(i,:), ...&lt;br /&gt;
         'DisplayName', ['t = ', num2str(t)]);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
title('Solución fundamental de la ecuación del calor', 'FontSize', 14);&lt;br /&gt;
xlabel('Posición (x)', 'FontSize', 12);&lt;br /&gt;
ylabel('\Phi(x,t)', 'FontSize', 12);&lt;br /&gt;
legend('show', 'FontSize', 11);&lt;br /&gt;
xlim([-1 1]); &lt;br /&gt;
&lt;br /&gt;
hold off;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| style=&amp;quot;vertical-align: middle; text-align: center;&amp;quot; |&lt;br /&gt;
[[Archivo:Solucionfundamentaldelaecuaciondelcalor.png|450px|thumb|center|Solución fundamental.]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Ilustrar  la solución fundamental de la ecuación del calor en dimensión 2.==&lt;br /&gt;
Vamos a representar ahora la solución fundamental en dimensión &amp;lt;math&amp;gt; 2&amp;lt;/math&amp;gt; para los tiempos &amp;lt;math&amp;gt;t=0.001 &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; t=0.01&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt; t= 0.1&amp;lt;/math&amp;gt; y veremos como se acerca a una Delta de Dirac, ya que toda la energía se concentra en un solo punto a medida que el tiempo se acerca a 0. Ahora la solución fundamental es de la forma:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math display=&amp;quot;block&amp;quot;&amp;gt;\Phi(x,t) = \frac{1}{4\pi k t} e^{-\frac{x^2 + y^2}{4kt}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El código es:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%; border: none; background: transparent;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;3&amp;quot; style=&amp;quot;text-align: left; background: #f2f2f2;&amp;quot; | Implementación en MATLAB: Representación dim=2&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; style=&amp;quot;vertical-align: top;&amp;quot; |&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
k = 1; &lt;br /&gt;
tiempos = [0.1, 0.01, 0.001]; &lt;br /&gt;
[X, Y] = meshgrid(linspace(-1, 1, 100), linspace(-1, 1, 100));&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
figure('Position', [100, 100, 1200, 400]);&lt;br /&gt;
for i = 1:length(tiempos)&lt;br /&gt;
    t = tiempos(i);&lt;br /&gt;
    Phi_2D = (1 / (4 * pi * k * t)) * exp(-(X.^2 + Y.^2) / (4 * k * t));&lt;br /&gt;
    &lt;br /&gt;
    subplot(1, 3, i);&lt;br /&gt;
    &lt;br /&gt;
    surf(X, Y, Phi_2D, 'EdgeColor', 'none');&lt;br /&gt;
    colormap(jet); &lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
    view(-30, 30); &lt;br /&gt;
    title(['t = ', num2str(t)], 'FontSize', 14);&lt;br /&gt;
    xlabel('x_1', 'FontSize', 12);&lt;br /&gt;
    ylabel('x_2', 'FontSize', 12);&lt;br /&gt;
    zlabel('\Phi', 'FontSize', 12);&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    xlim([-1 1]);&lt;br /&gt;
    ylim([-1 1]);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
sgtitle('Solución fundamental en dimensión 2', 'FontSize', 16, 'FontWeight', 'bold');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width: 33%; text-align: center; background: #f2f2f2;&amp;quot; | 1. t=0.1&lt;br /&gt;
! style=&amp;quot;width: 33%; text-align: center; background: #f2f2f2;&amp;quot; | 2. t=0.01&lt;br /&gt;
! style=&amp;quot;width: 33%; text-align: center; background: #f2f2f2;&amp;quot; | 3. t=0.001&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | &lt;br /&gt;
[[Archivo:Soluciont0.1GrupoCCE.png|300px|thumb|center|.]]&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | &lt;br /&gt;
[[Archivo:Soluciont0.01GrupoCCE.png|300px|thumb|center|.]]&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | &lt;br /&gt;
[[Archivo:Soluciont0.001GrupoCCE.png|300px|thumb|center|]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Autosemejanza==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%; border: none; background: transparent;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width: 65%; text-align: left; background: #f2f2f2;&amp;quot; | Implementación en MATLAB&lt;br /&gt;
! style=&amp;quot;width: 35%; text-align: center; background: #f2f2f2;&amp;quot; | Resultado Gráfico&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align: top;&amp;quot; |&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
clear; clc; close all;&lt;br /&gt;
&lt;br /&gt;
% Parámetro de difusión&lt;br /&gt;
k = 1;&lt;br /&gt;
&lt;br /&gt;
% Valores de tiempo&lt;br /&gt;
t_values = [0.01, 0.05, 0.1, 0.5, 1];&lt;br /&gt;
&lt;br /&gt;
% Dominio espacial&lt;br /&gt;
x = linspace(-1, 1, 1000);&lt;br /&gt;
&lt;br /&gt;
%% 🔹 Gráfica 1: u(x,t) para distintos tiempos&lt;br /&gt;
figure;&lt;br /&gt;
hold on;&lt;br /&gt;
&lt;br /&gt;
for t = t_values&lt;br /&gt;
    u = (1./sqrt(4*pi*k*t)) .* exp(-x.^2./(4*k*t));&lt;br /&gt;
    plot(x, u, 'LineWidth', 2);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
title('Solución de la ecuación del calor');&lt;br /&gt;
xlabel('x');&lt;br /&gt;
ylabel('u(x,t)');&lt;br /&gt;
legend('t=0.01','t=0.05','t=0.1','t=0.5','t=1');&lt;br /&gt;
grid on;&lt;br /&gt;
&lt;br /&gt;
%% 🔹 Gráfica 2: Autosemejanza&lt;br /&gt;
figure;&lt;br /&gt;
hold on;&lt;br /&gt;
&lt;br /&gt;
for t = t_values&lt;br /&gt;
    u = (1./sqrt(4*pi*k*t)) .* exp(-x.^2./(4*k*t));&lt;br /&gt;
    &lt;br /&gt;
    xi = x ./ sqrt(t);        % variable reescalada&lt;br /&gt;
    u_rescaled = u .* sqrt(t); % reescalado vertical&lt;br /&gt;
    &lt;br /&gt;
    plot(xi, u_rescaled, 'LineWidth', 2);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
title('Autosemejanza: colapso de curvas');&lt;br /&gt;
xlabel('\xi = x / sqrt(t)');&lt;br /&gt;
ylabel('u(x,t) * sqrt(t)');&lt;br /&gt;
legend('t=0.01','t=0.05','t=0.1','t=0.5','t=1');&lt;br /&gt;
grid on;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| style=&amp;quot;vertical-align: middle; text-align: center;&amp;quot; |&lt;br /&gt;
[[Archivo:Autosemejanza.jpeg|450px|thumb|center|Solución fundamental.]]&lt;br /&gt;
[[Archivo:Autosemejanza1bueno.jpeg|450px|thumb|center|Solución fundamental.]]&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%; border: none; background: transparent;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width: 65%; text-align: left; background: #f2f2f2;&amp;quot; | Implementación en MATLAB&lt;br /&gt;
! style=&amp;quot;width: 35%; text-align: center; background: #f2f2f2;&amp;quot; | Resultado Gráfico&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align: top;&amp;quot; |&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
clear; clc; close all;&lt;br /&gt;
&lt;br /&gt;
% Simulación Completa de Autosemejanza en 2D (Visualización 3D en 6 subplots)&lt;br /&gt;
clear; clc; close all;&lt;br /&gt;
&lt;br /&gt;
% --- Parámetros de la simulación ---&lt;br /&gt;
k = 1;                  % Difusividad térmica&lt;br /&gt;
tiempos = [0.1, 0.01, 0.001]; % Instantes de tiempo solicitados&lt;br /&gt;
[X, Y] = meshgrid(linspace(-1, 1, 200)); % Malla de visualización base&lt;br /&gt;
R2 = X.^2 + Y.^2;&lt;br /&gt;
&lt;br /&gt;
% Preparar la figura principal (grande para que se vea bien)&lt;br /&gt;
figure('Color', 'w', 'Position', [50, 50, 1300, 750]);&lt;br /&gt;
colores = jet(length(tiempos)+1); % Paleta de colores cálidos&lt;br /&gt;
&lt;br /&gt;
% --- Bucle para generar las 6 gráficas ---&lt;br /&gt;
for i = 1:length(tiempos)&lt;br /&gt;
    t = tiempos(i);&lt;br /&gt;
    &lt;br /&gt;
    % 1. Calcular la solución fundamental u(x, y, t) en 2D&lt;br /&gt;
    u = (1 / (4*pi*k*t)) * exp(-R2 / (4*k*t));&lt;br /&gt;
    &lt;br /&gt;
    % --- GRÁFICAS SUPERIORES: Solución Original u(x, y, t) ---&lt;br /&gt;
    subplot(2, 3, i);&lt;br /&gt;
    surf(X, Y, u, 'EdgeColor', 'none', 'FaceAlpha', 0.9);&lt;br /&gt;
    colormap(jet); shading interp; % Suavizar colores&lt;br /&gt;
    camlight; lighting gouraud; % Iluminación 3D&lt;br /&gt;
    view(3); grid on;&lt;br /&gt;
    &lt;br /&gt;
    % Ajuste de títulos y ejes (Notarás que las escalas cambian)&lt;br /&gt;
    title(['Original $u(x,y)$, $t = ' num2str(t) '$'], 'Interpreter', 'latex', 'FontSize', 12);&lt;br /&gt;
    xlabel('$x$', 'Interpreter', 'latex');&lt;br /&gt;
    ylabel('$y$', 'Interpreter', 'latex');&lt;br /&gt;
    zlabel('$u(x,y,t)$', 'Interpreter', 'latex');&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    % --- GRÁFICAS INFERIORES: Colapso (Autosemejanza 2D) ---&lt;br /&gt;
    subplot(2, 3, i+3);&lt;br /&gt;
    &lt;br /&gt;
    % APLICAR VARIABLES DE ESCALA PARA 2D:&lt;br /&gt;
    % Ejes X,Y: eta = r / sqrt(t)&lt;br /&gt;
    % Eje Z (Altura): u * t (En 1D era u * sqrt(t))&lt;br /&gt;
    &lt;br /&gt;
    Eta_X = X / sqrt(t);&lt;br /&gt;
    Eta_Y = Y / sqrt(t);&lt;br /&gt;
    U_escalada = u * t;&lt;br /&gt;
    &lt;br /&gt;
    % Graficar la superficie escalada&lt;br /&gt;
    surf(Eta_X, Eta_Y, U_escalada, 'FaceColor', colores(i,:), ...&lt;br /&gt;
        'EdgeColor', 'none', 'FaceAlpha', 0.8);&lt;br /&gt;
    shading interp; camlight; lighting gouraud;&lt;br /&gt;
    view(3); grid on;&lt;br /&gt;
    &lt;br /&gt;
    % Configuración de ejes fijos para notar el colapso geométrico&lt;br /&gt;
    % (Aquí todos deben verse iguales)&lt;br /&gt;
    axis([-5 5 -5 5 0 0.1]); &lt;br /&gt;
    title(['Escalada $Phi \cdot t$, $t = ' num2str(t) '$'], 'Interpreter', 'latex', 'FontSize', 12);&lt;br /&gt;
    xlabel('$\eta_x = x/\sqrt{t}$', 'Interpreter', 'latex');&lt;br /&gt;
    ylabel('$\eta_y = y/\sqrt{t}$', 'Interpreter', 'latex');&lt;br /&gt;
    zlabel('$Phi(x,y,t) \cdot t$', 'Interpreter', 'latex');&lt;br /&gt;
    &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% Título general del póster&lt;br /&gt;
sgtitle('Difusión en 2D: De la Delta de Dirac a la Autosemejanza Universal', 'FontSize', 16, 'FontWeight', 'bold');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| style=&amp;quot;vertical-align: middle; text-align: center;&amp;quot; |&lt;br /&gt;
[[Archivo:Carlos1.jpeg|450px|thumb|center|Solución fundamental.]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Mapa de calor=&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%; border: none; background: transparent;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width: 65%; text-align: left; background: #f2f2f2;&amp;quot; | Implementación en MATLAB&lt;br /&gt;
! style=&amp;quot;width: 35%; text-align: center; background: #f2f2f2;&amp;quot; | Resultado Gráfico&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align: top;&amp;quot; |&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
clear; clc; close all;&lt;br /&gt;
k = 1; &lt;br /&gt;
t_final = 1;&lt;br /&gt;
Nx = 300; &lt;br /&gt;
Nt = 300;&lt;br /&gt;
&lt;br /&gt;
x_full = linspace(-1, 1, Nx);&lt;br /&gt;
t_full = linspace(1e-4, t_final, Nt); después de cero para evitar la división por cero&lt;br /&gt;
[X, T] = meshgrid(x_full, t_full);&lt;br /&gt;
Phi_XT = (1 ./ sqrt(4 * pi * k * T)) .* exp(-(X.^2) ./ (4 * k * T));&lt;br /&gt;
&lt;br /&gt;
figure('Position', [100, 100, 800, 700], 'Color', 'k'); % Fondo negro&lt;br /&gt;
axes('Color', 'k', 'XColor', 'w', 'YColor', 'w'); % Ejes blancos sobre fondo negro&lt;br /&gt;
hold on; grid off; % Eliminamos la rejilla para un look más limpio&lt;br /&gt;
&lt;br /&gt;
% Usamos pcolor y shadin interp para el degradado&lt;br /&gt;
p = pcolor(X, T, Phi_XT);&lt;br /&gt;
shading interp; &lt;br /&gt;
&lt;br /&gt;
% elegir y ajustar el mapa de colores para el efecto &amp;quot;luz&amp;quot;&lt;br /&gt;
colormap(hot); %  mapa de colores cálido &lt;br /&gt;
caxis([0 3.5]);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
title({'MAPA ESPACIO-TEMPORAL: DELTA DE DIRAC PUNTUAL}, ...&lt;br /&gt;
      'FontSize', 16, 'FontWeight', 'bold', 'Color', 'w', 'Interpreter', 'latex');&lt;br /&gt;
xlabel('Posición (x)', 'FontSize', 14, 'Color', 'w');&lt;br /&gt;
ylabel('Tiempo (t)', 'FontSize', 14, 'Color', 'w');&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
xlim([-1 1]);&lt;br /&gt;
ylim([-0.02 t_final]); &lt;br /&gt;
view(0, 90); &lt;br /&gt;
hold off;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| style=&amp;quot;vertical-align: middle; text-align: center;&amp;quot; |&lt;br /&gt;
[[Archivo:MapadecalorgrupoCCE.png|450px|thumb|center|Mapa calor solucion fundamental.]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Decaimiento==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%; border: none; background: transparent;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width: 65%; text-align: left; background: #f2f2f2;&amp;quot; | Implementación en MATLAB&lt;br /&gt;
! style=&amp;quot;width: 35%; text-align: center; background: #f2f2f2;&amp;quot; | Resultado Gráfico&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align: top;&amp;quot; |&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
clear; clc; close all;&lt;br /&gt;
% Parámetros iniciales&lt;br /&gt;
k = 1; &lt;br /&gt;
t = logspace(0, 4, 100); &lt;br /&gt;
Phi_max_1D = (1 ./ sqrt(4 * pi * k * t)); &lt;br /&gt;
Phi_max_2D = (1 ./ (4 * pi * k * t));&lt;br /&gt;
&lt;br /&gt;
figure;&lt;br /&gt;
hold on;&lt;br /&gt;
grid on;&lt;br /&gt;
&lt;br /&gt;
% Dibujamos el decaimiento usando escala logarítmica en ambos ejes&lt;br /&gt;
loglog(t, Phi_max_1D, 'LineWidth', 2, 'Color', [0 0.4470 0.7410], ...&lt;br /&gt;
    'DisplayName', 'Decaimiento 1D (\propto t^{-1/2})');&lt;br /&gt;
    &lt;br /&gt;
loglog(t, Phi_max_2D, 'LineWidth', 2, 'Color', [0.8500 0.3250 0.0980], ...&lt;br /&gt;
    'DisplayName', 'Decaimiento 2D (\propto t^{-1})');&lt;br /&gt;
loglog(t, 0.2 * t.^(-0.5), '--k', 'LineWidth', 1, ...&lt;br /&gt;
    'DisplayName', 'Pendiente de referencia: -1/2');&lt;br /&gt;
loglog(t, 0.05 * t.^(-1), ':k', 'LineWidth', 1, ...&lt;br /&gt;
    'DisplayName', 'Pendiente de referencia: -1');&lt;br /&gt;
% ----------------------------------&lt;br /&gt;
&lt;br /&gt;
title('Decaimiento térmico en el origen cuando t \rightarrow \infty', 'FontSize', 14);&lt;br /&gt;
xlabel('Tiempo (t)', 'FontSize', 12);&lt;br /&gt;
ylabel('Temperatura máxima \Phi(0,t)', 'FontSize', 12);&lt;br /&gt;
legend('show', 'FontSize', 11, 'Location', 'southwest');&lt;br /&gt;
xlim([1 10^4]);&lt;br /&gt;
&lt;br /&gt;
hold off;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| style=&amp;quot;vertical-align: middle; text-align: center;&amp;quot; |&lt;br /&gt;
[[Archivo:Elena2.jpeg|450px|thumb|center|]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%; border: none; background: transparent;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width: 65%; text-align: left; background: #f2f2f2;&amp;quot; | Implementación en MATLAB&lt;br /&gt;
! style=&amp;quot;width: 35%; text-align: center; background: #f2f2f2;&amp;quot; | Resultado Gráfico&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align: top;&amp;quot; |&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
clear; clc; close all;&lt;br /&gt;
k = 1; &lt;br /&gt;
t = logspace(0, 4, 100);&lt;br /&gt;
Norma_L1 = ones(size(t)); &lt;br /&gt;
Norma_L2_1D = (8 * pi * k * t).^(-1/4); &lt;br /&gt;
&lt;br /&gt;
figure;&lt;br /&gt;
hold on;&lt;br /&gt;
grid on;&lt;br /&gt;
loglog(t, Norma_L1, 'LineWidth', 2, 'Color', [0.4660 0.6740 0.1880], ...&lt;br /&gt;
    'DisplayName', 'Norma L^1 (Conservación de energía)');&lt;br /&gt;
&lt;br /&gt;
loglog(t, Norma_L2_1D, 'LineWidth', 2, 'Color', [0 0.4470 0.7410], ...&lt;br /&gt;
    'DisplayName', 'Norma L^2 (Decaimiento \propto t^{-1/4})');&lt;br /&gt;
loglog(t, 0.5 * t.^(-0.25), '--k', 'LineWidth', 1, ...&lt;br /&gt;
    'DisplayName', 'Pendiente de ref: -1/4');&lt;br /&gt;
&lt;br /&gt;
title('Evolución de las normas L^1 y L^2 en 1D (t \rightarrow \infty)', 'FontSize', 14);&lt;br /&gt;
xlabel('Tiempo (t)', 'FontSize', 12);&lt;br /&gt;
ylabel('Valor de la norma', 'FontSize', 12);&lt;br /&gt;
ylim([0.01 2]); % Para dar algo de aire por arriba de la línea L1&lt;br /&gt;
legend('show', 'FontSize', 11, 'Location', 'southwest');&lt;br /&gt;
&lt;br /&gt;
hold off;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| style=&amp;quot;vertical-align: middle; text-align: center;&amp;quot; |&lt;br /&gt;
[[Archivo:Elena1.jpeg|450px|thumb|center|]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%; border: none; background: transparent;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width: 65%; text-align: left; background: #f2f2f2;&amp;quot; | Implementación en MATLAB&lt;br /&gt;
! style=&amp;quot;width: 35%; text-align: center; background: #f2f2f2;&amp;quot; | Resultado Gráfico&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align: top;&amp;quot; |&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
clear; clc; close all;&lt;br /&gt;
% Parámetros iniciales&lt;br /&gt;
k = 1;&lt;br /&gt;
x = linspace(-2, 2, 100);&lt;br /&gt;
y = linspace(-2, 2, 100);&lt;br /&gt;
[X, Y] = meshgrid(x, y);&lt;br /&gt;
tiempos = [0.05, 0.2, 0.5, 1];&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
figure('Position', [100, 100, 1200, 350], 'Name', 'Solución Fundamental 2D');&lt;br /&gt;
for i = 1:length(tiempos)&lt;br /&gt;
    t = tiempos(i);&lt;br /&gt;
    Phi = (1 / (4 * pi * k * t)) * exp(-(X.^2 + Y.^2) / (4 * k * t));&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    subplot(1, 4, i);&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    surf(X, Y, Phi, 'EdgeColor', 'none'); &lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    colormap turbo; &lt;br /&gt;
    grid on;&lt;br /&gt;
    zlim([0 1.6]); &lt;br /&gt;
    &lt;br /&gt;
    title(['t = ', num2str(t)], 'FontSize', 12);&lt;br /&gt;
    xlabel('Posición (x)', 'FontSize', 10);&lt;br /&gt;
    ylabel('Posición (y)', 'FontSize', 10);&lt;br /&gt;
    zlabel('\Phi(x,y,t)', 'FontSize', 10);&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    view(-30, 30); &lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| style=&amp;quot;vertical-align: middle; text-align: center;&amp;quot; |&lt;br /&gt;
[[Archivo:Elena3.jpeg|450px|thumb|center|]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Categoría:EDP]]&lt;br /&gt;
[[Categoría:EDP25/26]]&lt;/div&gt;</summary>
		<author><name>Coloma de Lara</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/wiki/Ecuaci%C3%B3n_del_calor_NAA</id>
		<title>Ecuación del calor NAA</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/wiki/Ecuaci%C3%B3n_del_calor_NAA"/>
				<updated>2026-04-11T17:26:09Z</updated>
		
		<summary type="html">&lt;p&gt;Ainhoa: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ TrabajoED | Series de Fourier. Grupo NAA| [[:Categoría:EDP|EDP]]|[[:Categoría:EDP25/26|2025-26]] | Natalia Gutiérrez de Uriarte &lt;br /&gt;
&lt;br /&gt;
Alba Peralta Zamora&lt;br /&gt;
&lt;br /&gt;
Ainhoa Martín García}}&lt;br /&gt;
&lt;br /&gt;
[[Archivo:ecuacion_del_calor_NAA_3.png|800px|right|]]&lt;br /&gt;
&lt;br /&gt;
[[Archivo:ecuación_del_calor_NAA_1.pdf|800px|right|]]&lt;br /&gt;
&lt;br /&gt;
A continuación, se van a mostrar los códigos que se han utilizado para representar cada una de las gráficas del trabajo. Todos ellos han sido escritos en Python.&lt;br /&gt;
En ambos códigos se pueden modificar la temperatura media, el periodo, la kappa (difusividad térmica) y los tiempos, ajustándolos a otros planetas y poder representar la temperatura de estos.&lt;br /&gt;
&lt;br /&gt;
Código que representa la temperatura frente a la profundidad en la Tierra: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
Tm = 15 #temperatura media de la Tierra en grados.&lt;br /&gt;
A0 = 10&lt;br /&gt;
kappa = 1e-6&lt;br /&gt;
P = 86400  # periodo diario&lt;br /&gt;
&lt;br /&gt;
# Dominio&lt;br /&gt;
x = np.linspace(0, 2, 200)  # profundidad hasta 2 m&lt;br /&gt;
&lt;br /&gt;
# Tiempos distintos&lt;br /&gt;
times = [0, P/4, P/2, 3*P/4]&lt;br /&gt;
&lt;br /&gt;
for t in times:&lt;br /&gt;
    T = Tm + A0*np.exp(-x*np.sqrt(np.pi/(P*kappa))) * \&lt;br /&gt;
        np.sin(2*np.pi*t/P - x*np.sqrt(np.pi/(P*kappa)))&lt;br /&gt;
    plt.plot(x, T, label=f&amp;quot;t={t/3600:.1f} h&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
plt.xlabel(&amp;quot;Profundidad (m)&amp;quot;)&lt;br /&gt;
plt.ylabel(&amp;quot;Temperatura (°C)&amp;quot;)&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.title(&amp;quot;Temperatura vs profundidad&amp;quot;)&lt;br /&gt;
plt.grid()&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Código que representa la temperatura frente al tiempo en la Tierra:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
Tm = 15&lt;br /&gt;
A0 = 10&lt;br /&gt;
kappa = 1e-6&lt;br /&gt;
P = 86400  # periodo diario&lt;br /&gt;
&lt;br /&gt;
t = np.linspace(0, P, 500)&lt;br /&gt;
&lt;br /&gt;
# distintas profundidades&lt;br /&gt;
depths = [0, 0.25, 0.5, 1, 2]&lt;br /&gt;
&lt;br /&gt;
for x in depths:&lt;br /&gt;
    T = Tm + A0*np.exp(-x*np.sqrt(np.pi/(P*kappa))) * \&lt;br /&gt;
        np.sin(2*np.pi*t/P - x*np.sqrt(np.pi/(P*kappa)))&lt;br /&gt;
    plt.plot(t/3600, T, label=f&amp;quot;x={x} m&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
plt.xlabel(&amp;quot;Tiempo (horas)&amp;quot;)&lt;br /&gt;
plt.ylabel(&amp;quot;Temperatura (°C)&amp;quot;)&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.title(&amp;quot;Temperatura vs tiempo a distintas profundidades&amp;quot;)&lt;br /&gt;
plt.grid()&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Categoría:EDP]]&lt;br /&gt;
[[Categoría:EDP25/26]]&lt;/div&gt;</summary>
		<author><name>Ainhoa</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/wiki/Ecuaci%C3%B3n_del_calor_CCP</id>
		<title>Ecuación del calor CCP</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/wiki/Ecuaci%C3%B3n_del_calor_CCP"/>
				<updated>2026-04-11T08:44:36Z</updated>
		
		<summary type="html">&lt;p&gt;Covadonga: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ TrabajoED &lt;br /&gt;
| Ecuación del calor CCP&lt;br /&gt;
| [[Categoría:EDP|EDP]] EDP&lt;br /&gt;
|[[Categoría:EDP25/26|Ecuación del calor CCP]] Curso 2025-26&lt;br /&gt;
| Claudia Pozurama Pliego&amp;lt;br&amp;gt;Covadonga Díaz García&amp;lt;br&amp;gt;Paula Blanco Díez&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Poster calor CCP (1).png|center|800px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A continuación se muestran los códigos utilizados en el proyecto.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#DATO INICIAL...............................................................&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
# Definimos los tramos&lt;br /&gt;
x1 = np.linspace(0, 1/3, 300)&lt;br /&gt;
x2 = np.linspace(1/3, 2/3, 300)&lt;br /&gt;
x3 = np.linspace(2/3, 1, 300)&lt;br /&gt;
&lt;br /&gt;
# Figura&lt;br /&gt;
plt.figure(figsize=(9,5))&lt;br /&gt;
&lt;br /&gt;
# Tramos de la función&lt;br /&gt;
plt.plot(x1, 10*np.ones_like(x1), color='red', linewidth=3)&lt;br /&gt;
plt.plot(x2, np.zeros_like(x2), color='blue', linewidth=3)&lt;br /&gt;
plt.plot(x3, 10*np.ones_like(x3), color='red', linewidth=3)&lt;br /&gt;
&lt;br /&gt;
# Líneas de discontinuidad&lt;br /&gt;
plt.axvline(1/3, color='skyblue', linestyle='--', linewidth=1)&lt;br /&gt;
plt.axvline(2/3, color='skyblue', linestyle='--', linewidth=1)&lt;br /&gt;
&lt;br /&gt;
# Texto&lt;br /&gt;
plt.text(0.15, 10.4, 'Zona caliente', color='red', fontsize=10)&lt;br /&gt;
plt.text(0.72, 10.4, 'Zona caliente', color='red', fontsize=10)&lt;br /&gt;
plt.text(0.45, 0.6, 'Zona fría', color='blue', fontsize=10)&lt;br /&gt;
&lt;br /&gt;
# Ejes y título&lt;br /&gt;
plt.xlabel('$x$')&lt;br /&gt;
plt.ylabel('Temperatura')&lt;br /&gt;
plt.title('Dato inicial: distribución de temperatura')&lt;br /&gt;
&lt;br /&gt;
# Límites&lt;br /&gt;
plt.xlim(0,1)&lt;br /&gt;
plt.ylim(-1,11)&lt;br /&gt;
&lt;br /&gt;
# Cuadrícula&lt;br /&gt;
plt.grid(alpha=0.3)&lt;br /&gt;
&lt;br /&gt;
plt.tight_layout()&lt;br /&gt;
plt.savefig('Dato inicial.png', dpi=300)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#EVOLUCIÓN TEMPERATURA...............................................................&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
# Mallado&lt;br /&gt;
x = np.linspace(0, 1, 1000)&lt;br /&gt;
&lt;br /&gt;
# Dato inicial&lt;br /&gt;
def u0(x):&lt;br /&gt;
    return np.where((x &amp;gt;= 1/3) &amp;amp; (x &amp;lt;= 2/3), 0, 10)&lt;br /&gt;
&lt;br /&gt;
# Restamos estado estacionario&lt;br /&gt;
def v0(x):&lt;br /&gt;
    return u0(x) - 10&lt;br /&gt;
&lt;br /&gt;
# Número de términos de Fourier&lt;br /&gt;
N = 100&lt;br /&gt;
&lt;br /&gt;
# Coeficientes (trapecio)&lt;br /&gt;
b = np.zeros(N)&lt;br /&gt;
for n in range(1, N+1):&lt;br /&gt;
    integrando = v0(x) * np.sin(n*np.pi*x)&lt;br /&gt;
    b[n-1] = 2 * np.trapz(integrando, x)&lt;br /&gt;
&lt;br /&gt;
# Solución aproximada&lt;br /&gt;
def u(x, t):&lt;br /&gt;
    if t == 0:&lt;br /&gt;
        return u0(x)&lt;br /&gt;
    suma = np.zeros_like(x)&lt;br /&gt;
    for n in range(1, N+1):&lt;br /&gt;
        suma += b[n-1] * np.exp(-n**2 * np.pi**2 * t) * np.sin(n*np.pi*x)&lt;br /&gt;
    return 10 + suma&lt;br /&gt;
&lt;br /&gt;
# Figura&lt;br /&gt;
plt.figure(figsize=(9,5))&lt;br /&gt;
&lt;br /&gt;
# t=0 (DISCONTINUA)&lt;br /&gt;
x1 = np.linspace(0, 1/3, 300)&lt;br /&gt;
x2 = np.linspace(1/3, 2/3, 300)&lt;br /&gt;
x3 = np.linspace(2/3, 1, 300)&lt;br /&gt;
&lt;br /&gt;
plt.plot(x1, 10*np.ones_like(x1), color='black', linewidth=3, label='t=0')&lt;br /&gt;
plt.plot(x2, np.zeros_like(x2), color='black', linewidth=3)&lt;br /&gt;
plt.plot(x3, 10*np.ones_like(x3), color='black', linewidth=3)&lt;br /&gt;
&lt;br /&gt;
# t&amp;gt;0 (SUAVE)&lt;br /&gt;
times = [0.001, 0.01, 0.05, 0.1]&lt;br /&gt;
colors = ['blue', 'green', 'orange', 'red']&lt;br /&gt;
&lt;br /&gt;
for t, c in zip(times, colors):&lt;br /&gt;
    plt.plot(x, u(x, t), color=c, linewidth=2.5, label=f't={t}')&lt;br /&gt;
&lt;br /&gt;
# Líneas verticales&lt;br /&gt;
plt.axvline(1/3, linestyle='--', alpha=0.4)&lt;br /&gt;
plt.axvline(2/3, linestyle='--', alpha=0.4)&lt;br /&gt;
&lt;br /&gt;
# Texto&lt;br /&gt;
plt.text(0.1, 10.4, 'Zona caliente', fontsize=10)&lt;br /&gt;
plt.text(0.38, 0.7, 'Zona fría inicial', fontsize=10)&lt;br /&gt;
&lt;br /&gt;
# Ejes&lt;br /&gt;
plt.xlabel('x')&lt;br /&gt;
plt.ylabel('Temperatura')&lt;br /&gt;
plt.title('Evolución de la temperatura en la barra')&lt;br /&gt;
&lt;br /&gt;
plt.xlim(0,1)&lt;br /&gt;
plt.ylim(-1,11)&lt;br /&gt;
&lt;br /&gt;
plt.grid(alpha=0.3)&lt;br /&gt;
plt.legend()&lt;br /&gt;
&lt;br /&gt;
plt.tight_layout()&lt;br /&gt;
plt.savefig('Evolucion temperatura.png', dpi=300)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
# ZOOM EN LA ZONA CENTRAL ..............................................................&lt;br /&gt;
&lt;br /&gt;
plt.figure(figsize=(6,4))&lt;br /&gt;
&lt;br /&gt;
mask = (x &amp;gt;= 0.4) &amp;amp; (x &amp;lt;= 0.6)&lt;br /&gt;
x_zoom = x[mask]&lt;br /&gt;
&lt;br /&gt;
# t=0&lt;br /&gt;
plt.plot(x_zoom, u0(x_zoom), color='black', linewidth=3, label='t=0')&lt;br /&gt;
&lt;br /&gt;
# t pequeño&lt;br /&gt;
t_zoom = 0.001&lt;br /&gt;
plt.plot(x_zoom, u(x_zoom, t_zoom), color='blue', linewidth=2.5, label='t=0.001')&lt;br /&gt;
&lt;br /&gt;
# Líneas verticales&lt;br /&gt;
plt.axvline(1/3, linestyle='--', alpha=0.3)&lt;br /&gt;
plt.axvline(2/3, linestyle='--', alpha=0.3)&lt;br /&gt;
&lt;br /&gt;
# CLAVE: zoom fuerte en eje Y&lt;br /&gt;
plt.ylim(-0.005, 0.05)&lt;br /&gt;
&lt;br /&gt;
# Etiquetas&lt;br /&gt;
plt.title('Zoom en la zona central')&lt;br /&gt;
plt.xlabel('x')&lt;br /&gt;
plt.ylabel('Temperatura')&lt;br /&gt;
&lt;br /&gt;
plt.grid(alpha=0.3)&lt;br /&gt;
plt.legend()&lt;br /&gt;
&lt;br /&gt;
plt.tight_layout()&lt;br /&gt;
plt.savefig('zoom_centro.png', dpi=300)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#ECUACIÓN DEL CALOR ......................................................................&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
# Mallado&lt;br /&gt;
x = np.linspace(0, 1, 1000)&lt;br /&gt;
&lt;br /&gt;
# =======================&lt;br /&gt;
# MODELO 1: ECUACIÓN DEL CALOR&lt;br /&gt;
# =======================&lt;br /&gt;
&lt;br /&gt;
def u0(x):&lt;br /&gt;
    return np.where((x &amp;gt;= 1/3) &amp;amp; (x &amp;lt;= 2/3), 0, 10)&lt;br /&gt;
&lt;br /&gt;
def v0(x):&lt;br /&gt;
    return u0(x) - 10&lt;br /&gt;
&lt;br /&gt;
N = 100&lt;br /&gt;
&lt;br /&gt;
b = np.zeros(N)&lt;br /&gt;
for n in range(1, N+1):&lt;br /&gt;
    integrando = v0(x) * np.sin(n*np.pi*x)&lt;br /&gt;
    b[n-1] = 2 * np.trapz(integrando, x)&lt;br /&gt;
&lt;br /&gt;
def u(x, t):&lt;br /&gt;
    if t == 0:&lt;br /&gt;
        return u0(x)&lt;br /&gt;
    suma = np.zeros_like(x)&lt;br /&gt;
    for n in range(1, N+1):&lt;br /&gt;
        suma += b[n-1] * np.exp(-n**2 * np.pi**2 * t) * np.sin(n*np.pi*x)&lt;br /&gt;
    return suma + 10&lt;br /&gt;
&lt;br /&gt;
# =======================&lt;br /&gt;
# MODELO 2: VELOCIDAD FINITA&lt;br /&gt;
# =======================&lt;br /&gt;
&lt;br /&gt;
def u_finite_speed(x, t, c=0.18, delta=0.025):&lt;br /&gt;
    left_front = 1/3 - c*t&lt;br /&gt;
    right_front = 2/3 + c*t&lt;br /&gt;
&lt;br /&gt;
    u = np.full_like(x, 10.0)&lt;br /&gt;
&lt;br /&gt;
    inside = (x &amp;gt;= left_front) &amp;amp; (x &amp;lt;= right_front)&lt;br /&gt;
    u[inside] = 0.0&lt;br /&gt;
&lt;br /&gt;
    left_transition = (x &amp;gt; left_front - delta) &amp;amp; (x &amp;lt; left_front)&lt;br /&gt;
    u[left_transition] = 10 * (left_front - x[left_transition]) / delta&lt;br /&gt;
&lt;br /&gt;
    right_transition = (x &amp;gt; right_front) &amp;amp; (x &amp;lt; right_front + delta)&lt;br /&gt;
    u[right_transition] = 10 * (x[right_transition] - right_front) / delta&lt;br /&gt;
&lt;br /&gt;
    return np.clip(u, 0, 10)&lt;br /&gt;
&lt;br /&gt;
# =======================&lt;br /&gt;
# PLOT DOBLE&lt;br /&gt;
# =======================&lt;br /&gt;
&lt;br /&gt;
fig, axs = plt.subplots(1, 2, figsize=(12,5))&lt;br /&gt;
&lt;br /&gt;
# Colores consistentes&lt;br /&gt;
colors = ['tab:blue', 'tab:orange', 'tab:green', 'tab:red']&lt;br /&gt;
times = [0, 0.01, 0.03, 0.06]&lt;br /&gt;
&lt;br /&gt;
# --------- IZQUIERDA (ecuación del calor)&lt;br /&gt;
ax = axs[0]&lt;br /&gt;
&lt;br /&gt;
# t = 0 por tramos&lt;br /&gt;
x1 = np.linspace(0, 1/3, 300)&lt;br /&gt;
x2 = np.linspace(1/3, 2/3, 300)&lt;br /&gt;
x3 = np.linspace(2/3, 1, 300)&lt;br /&gt;
&lt;br /&gt;
ax.plot(x1, 10*np.ones_like(x1), color=colors[0], linewidth=2, label='t = 0')&lt;br /&gt;
ax.plot(x2, np.zeros_like(x2), color=colors[0], linewidth=2)&lt;br /&gt;
ax.plot(x3, 10*np.ones_like(x3), color=colors[0], linewidth=2)&lt;br /&gt;
&lt;br /&gt;
# t &amp;gt; 0&lt;br /&gt;
for t, c in zip(times[1:], colors[1:]):&lt;br /&gt;
    ax.plot(x, u(x, t), color=c, linewidth=2, label=f't = {t}')&lt;br /&gt;
&lt;br /&gt;
ax.axvline(1/3, linestyle='--', alpha=0.3)&lt;br /&gt;
ax.axvline(2/3, linestyle='--', alpha=0.3)&lt;br /&gt;
&lt;br /&gt;
ax.set_title(&amp;quot;Ecuación del calor (difusión instantánea)&amp;quot;)&lt;br /&gt;
ax.set_xlabel(&amp;quot;x&amp;quot;)&lt;br /&gt;
ax.set_ylabel(&amp;quot;Temperatura&amp;quot;)&lt;br /&gt;
ax.grid(alpha=0.3)&lt;br /&gt;
ax.legend()&lt;br /&gt;
&lt;br /&gt;
# --------- DERECHA (velocidad finita)&lt;br /&gt;
ax = axs[1]&lt;br /&gt;
&lt;br /&gt;
for t, c in zip(times, colors):&lt;br /&gt;
    ax.plot(x, u_finite_speed(x, t), color=c, linewidth=2, label=f't = {t}')&lt;br /&gt;
&lt;br /&gt;
ax.axvline(1/3, linestyle='--', alpha=0.3)&lt;br /&gt;
ax.axvline(2/3, linestyle='--', alpha=0.3)&lt;br /&gt;
&lt;br /&gt;
ax.set_title(&amp;quot;Modelo esquemático (velocidad finita)&amp;quot;)&lt;br /&gt;
ax.set_xlabel(&amp;quot;x&amp;quot;)&lt;br /&gt;
ax.set_ylabel(&amp;quot;Temperatura&amp;quot;)&lt;br /&gt;
ax.grid(alpha=0.3)&lt;br /&gt;
ax.legend()&lt;br /&gt;
&lt;br /&gt;
# Ajuste final&lt;br /&gt;
plt.tight_layout()&lt;br /&gt;
plt.savefig('ec_calor.png', dpi=300)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#BOLLO ...........................................................&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
x = np.linspace(0, 1, 1000)&lt;br /&gt;
&lt;br /&gt;
def bollo(x, t):&lt;br /&gt;
    center = 0.5&lt;br /&gt;
    dist = np.abs(x - center)&lt;br /&gt;
    &lt;br /&gt;
    c = 0.25&lt;br /&gt;
    front = c * t&lt;br /&gt;
    &lt;br /&gt;
    u = np.zeros_like(x)&lt;br /&gt;
    &lt;br /&gt;
    # zonas que ya han sido alcanzadas por el calor&lt;br /&gt;
    heated = dist &amp;gt;= (0.5 - front)&lt;br /&gt;
    &lt;br /&gt;
    # crecimiento suave desde los bordes&lt;br /&gt;
    u[heated] = 10 * (1 - np.exp(-5 * (dist[heated] - (0.5 - front))))&lt;br /&gt;
    &lt;br /&gt;
    return np.clip(u, 0, 10)&lt;br /&gt;
&lt;br /&gt;
times = [0, 0.5, 1, 2]&lt;br /&gt;
&lt;br /&gt;
plt.figure(figsize=(6,4))&lt;br /&gt;
&lt;br /&gt;
for t in times:&lt;br /&gt;
    plt.plot(x, bollo(x, t), label=f&amp;quot;t={t}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
plt.xlabel(&amp;quot;posición en el bollo&amp;quot;)&lt;br /&gt;
plt.ylabel(&amp;quot;temperatura&amp;quot;)&lt;br /&gt;
plt.title(&amp;quot;Calentamiento progresivo de un bollo&amp;quot;)&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(alpha=0.3)&lt;br /&gt;
plt.savefig('cal_prog.png', dpi=300)&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Covadonga</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/wiki/Ecuaci%C3%B3n_del_Calor_L%C3%81J</id>
		<title>Ecuación del Calor LÁJ</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/wiki/Ecuaci%C3%B3n_del_Calor_L%C3%81J"/>
				<updated>2026-04-08T06:35:43Z</updated>
		
		<summary type="html">&lt;p&gt;Álvaro Moreno: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ TrabajoED | Ecuación del calor. Grupo LÁJ| [[:Categoría:EDP|EDP]]|[[:Categoría:EDP25/26|2025-26]] | Luis García Suárez&lt;br /&gt;
&lt;br /&gt;
Álvaro Moreno Cisneros&lt;br /&gt;
&lt;br /&gt;
Juan Pérez Guerra }}&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Ecuación del calor LÁJ.png||800px]]&lt;br /&gt;
[[Medio:Ecuación del calor LÁJ.pdf| PDF del póster]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Abajo se puede ver el código que se ha utilizado para conseguir las gráficas. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
from scipy.integrate import trapezoid&lt;br /&gt;
from matplotlib import cm&lt;br /&gt;
&lt;br /&gt;
# Ecuación del calor acotada-----------------------------------------------------------------------&lt;br /&gt;
def Eca_Acotada(L,alpha,n_terms,f):&lt;br /&gt;
&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    Aproxima la solución de la ecuación del calor u_t -alpha * u_xx = 0, con &lt;br /&gt;
    condición inicial f(x) y condiciones frontera dirichlet homogéneas&lt;br /&gt;
&lt;br /&gt;
    Inputs: &lt;br /&gt;
        L: longitud de la barra&lt;br /&gt;
        alpha: constante&lt;br /&gt;
        n_terms: número de términos para la serie de Fourier&lt;br /&gt;
        f: condición inicial&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    # 1. Preparar la malla con T en el eje &amp;quot;X&amp;quot; y X en el eje &amp;quot;Y&amp;quot;&lt;br /&gt;
    t_plot = np.linspace(0, 0.1, 100)&lt;br /&gt;
    x_plot = np.linspace(0, L, 100)&lt;br /&gt;
    T, X = np.meshgrid(t_plot, x_plot)&lt;br /&gt;
&lt;br /&gt;
    # 2. Cálculo de coeficientes a_n con la fórmula del trapecio&lt;br /&gt;
    x_fine = np.linspace(0, L, 1000)&lt;br /&gt;
    y_init = f(x_fine)&lt;br /&gt;
    a = np.zeros(n_terms + 1)&lt;br /&gt;
    for n in range(1, n_terms + 1):&lt;br /&gt;
        integrando = y_init * np.sin(n * np.pi * x_fine / L)&lt;br /&gt;
        a[n] = (2/L) * trapezoid(integrando, x=x_fine)&lt;br /&gt;
&lt;br /&gt;
    # 3. Calcular la solución U(T, X)&lt;br /&gt;
    U = np.zeros_like(T)&lt;br /&gt;
    for n in range(1, n_terms + 1):&lt;br /&gt;
        term_exp = np.exp(-alpha * (n * np.pi / L)**2 * T)&lt;br /&gt;
        term_sin = np.sin(n * np.pi * X / L)&lt;br /&gt;
        U += a[n] * term_exp * term_sin&lt;br /&gt;
&lt;br /&gt;
    # 4. Graficar&lt;br /&gt;
    fig = plt.figure(figsize=(12, 8))&lt;br /&gt;
    ax = fig.add_subplot(111, projection='3d')&lt;br /&gt;
&lt;br /&gt;
    # Ahora graficamos T en el primer eje y X en el segundo&lt;br /&gt;
    surf = ax.plot_surface(T, X, U, cmap=cm.inferno, linewidth=0, antialiased=True)&lt;br /&gt;
&lt;br /&gt;
    ax.set_xlabel('Tiempo (t)')&lt;br /&gt;
    ax.set_ylabel('Posición (x)')&lt;br /&gt;
    ax.set_zlabel('Temperatura (u)')&lt;br /&gt;
    ax.set_title('Visualización: Tiempo vs Posición')&lt;br /&gt;
    fig.colorbar(surf, shrink=0.5, aspect=5)&lt;br /&gt;
&lt;br /&gt;
    ax.view_init(elev=30, azim=-120)&lt;br /&gt;
&lt;br /&gt;
    plt.show()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Parámetros &lt;br /&gt;
L = 1.0        &lt;br /&gt;
alpha = 1.0    &lt;br /&gt;
n_terms = 50   &lt;br /&gt;
&lt;br /&gt;
# Dato inicial&lt;br /&gt;
def f(x):&lt;br /&gt;
    return np.where((x &amp;gt;= 0.3) &amp;amp; (x &amp;lt;= 0.7), 10.0, 0.0)&lt;br /&gt;
# def f(x):&lt;br /&gt;
#     return 1.0 - 2.0 * np.abs(0.5 - x)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# LLamamos a la función&lt;br /&gt;
Eca_Acotada(L,alpha,n_terms,f)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Ecuación del calor no acotada-----------------------------------------------------------------------&lt;br /&gt;
# Visualizar como la solución fundamental tiende a la delta de Dirac------------------------&lt;br /&gt;
# Parámetros&lt;br /&gt;
alpha = 1.0  # Difusividad térmica&lt;br /&gt;
&lt;br /&gt;
# Definición de la solución fundamental&lt;br /&gt;
def solucion_fundamental(x, t, alpha):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    Calcula el valor de la solución fundamental en (x, t).&lt;br /&gt;
    Representa la distribución de calor partiendo de una masa puntual en x=0.&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    # Evitamos división por cero si t=0&lt;br /&gt;
    if t &amp;lt;= 0:&lt;br /&gt;
        return np.zeros_like(x)&lt;br /&gt;
    &lt;br /&gt;
    coeficiente = 1.0 / np.sqrt(4 * np.pi * alpha * t)&lt;br /&gt;
    exponente = - (x**2) / (4 * alpha * t)&lt;br /&gt;
    return coeficiente * np.exp(exponente)&lt;br /&gt;
&lt;br /&gt;
# Configuración de la visualización&lt;br /&gt;
x = np.linspace(-2, 2, 1000)&lt;br /&gt;
# Tiempos que se acercan a cero para ver la Delta de Dirac&lt;br /&gt;
tiempos = [0.1, 0.05, 0.01, 0.005, 0.001] &lt;br /&gt;
&lt;br /&gt;
plt.figure(figsize=(10, 6))&lt;br /&gt;
&lt;br /&gt;
for t in tiempos:&lt;br /&gt;
    u = solucion_fundamental(x, t, alpha)&lt;br /&gt;
    plt.plot(x, u, label=f't = {t}')&lt;br /&gt;
&lt;br /&gt;
plt.title('Convergencia de la Solución Fundamental a la Delta de Dirac')&lt;br /&gt;
plt.xlabel('Posición (x)')&lt;br /&gt;
plt.ylabel('Temperatura (u)')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True, linestyle=':')&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#Visualizar la solución fundamental en 3D----------------&lt;br /&gt;
# Parámetros&lt;br /&gt;
alpha = 1.0&lt;br /&gt;
&lt;br /&gt;
# 1. Crear malla de puntos (T en el primer eje, X en el segundo)&lt;br /&gt;
t_plot = np.linspace(0.005, 0.1, 100)&lt;br /&gt;
x_plot = np.linspace(-2, 2, 100)&lt;br /&gt;
T, X = np.meshgrid(t_plot, x_plot) # Invertimos el orden para el intercambio&lt;br /&gt;
&lt;br /&gt;
# 2. Calcular la solución fundamental&lt;br /&gt;
U = (1.0 / np.sqrt(4 * np.pi * alpha * T)) * np.exp(-(X**2) / (4 * alpha * T))&lt;br /&gt;
&lt;br /&gt;
# 3. Graficar&lt;br /&gt;
fig = plt.figure(figsize=(12, 8))&lt;br /&gt;
ax = fig.add_subplot(111, projection='3d')&lt;br /&gt;
&lt;br /&gt;
# Graficamos T en el eje X del gráfico, X en el eje Y&lt;br /&gt;
surf = ax.plot_surface(T, X, U, cmap=cm.viridis, linewidth=0, antialiased=True)&lt;br /&gt;
&lt;br /&gt;
# Etiquetas corregidas&lt;br /&gt;
ax.set_xlabel('Tiempo (t)')&lt;br /&gt;
ax.set_ylabel('Posición (x)')&lt;br /&gt;
ax.set_zlabel('Temperatura (u)')&lt;br /&gt;
ax.set_title('Núcleo de Calor: Evolución del Pico (t -&amp;gt; 0)')&lt;br /&gt;
&lt;br /&gt;
fig.colorbar(surf, shrink=0.5, aspect=5)&lt;br /&gt;
&lt;br /&gt;
ax.view_init(elev=30, azim=-120)&lt;br /&gt;
&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#Visualizar solución de la ecuación del calor no acotada----------------&lt;br /&gt;
&lt;br /&gt;
# 1. Definición del núcleo y dato inicial&lt;br /&gt;
def kernel(x, t, alpha=1.0):&lt;br /&gt;
    return (1.0 / np.sqrt(4 * np.pi * alpha * t)) * np.exp(-(x**2) / (4 * alpha * t))&lt;br /&gt;
&lt;br /&gt;
def u0(y):&lt;br /&gt;
    # Dato inicial&lt;br /&gt;
    return np.where((y &amp;gt;= 0) &amp;amp; (y &amp;lt;= 1), 1.0, 0.0)&lt;br /&gt;
&lt;br /&gt;
# 2. Configuración de la malla&lt;br /&gt;
t_range = np.linspace(0.001, 1, 50)  # Eje T&lt;br /&gt;
x_range = np.linspace(-2, 3, 60)      # Eje X&lt;br /&gt;
T, X = np.meshgrid(t_range, x_range)&lt;br /&gt;
&lt;br /&gt;
# Espacio de integración para la convolución (eje y)&lt;br /&gt;
y_int = np.linspace(-4, 5, 500)&lt;br /&gt;
u_initial_values = u0(y_int)&lt;br /&gt;
&lt;br /&gt;
# 3. Cálculo de la superficie U(T, X)&lt;br /&gt;
U = np.zeros_like(X)&lt;br /&gt;
&lt;br /&gt;
for i in range(len(x_range)):&lt;br /&gt;
    for j in range(len(t_range)):&lt;br /&gt;
        curr_x = X[i, j]&lt;br /&gt;
        curr_t = T[i, j]&lt;br /&gt;
        # Realizamos la convolución numérica para cada punto (x, t)&lt;br /&gt;
        integrando = kernel(curr_x - y_int, curr_t) * u_initial_values&lt;br /&gt;
        U[i, j] = trapezoid(integrando, x=y_int)&lt;br /&gt;
&lt;br /&gt;
# 4. Graficar en 3D&lt;br /&gt;
fig = plt.figure(figsize=(12, 8))&lt;br /&gt;
ax = fig.add_subplot(111, projection='3d')&lt;br /&gt;
&lt;br /&gt;
# Graficamos con Tiempo en el primer eje y Posición en el segundo&lt;br /&gt;
surf = ax.plot_surface(T, X, U, cmap=cm.plasma, linewidth=0, antialiased=True)&lt;br /&gt;
&lt;br /&gt;
ax.set_xlabel('Tiempo (t)')&lt;br /&gt;
ax.set_ylabel('Posición (x)')&lt;br /&gt;
ax.set_zlabel('Temperatura (u)')&lt;br /&gt;
ax.set_title('Solución por Convolución: Disipación de un bloque de calor')&lt;br /&gt;
&lt;br /&gt;
fig.colorbar(surf, shrink=0.5, aspect=5)&lt;br /&gt;
ax.view_init(elev=30, azim=-130)&lt;br /&gt;
&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Ver como el máximo va disminuyendo a lo largo del tiempo&lt;br /&gt;
maximos = [np.max(U[:, j]) for j in range(len(t_range))]&lt;br /&gt;
&lt;br /&gt;
plt.figure(figsize=(8, 4))&lt;br /&gt;
plt.plot(t_range, maximos, color='red', linewidth=2)&lt;br /&gt;
plt.axhline(y=1.0, color='black', linestyle='--', label='Máximo Inicial (t=0)')&lt;br /&gt;
plt.title('Validación del Principio del Máximo')&lt;br /&gt;
plt.xlabel('Tiempo (t)')&lt;br /&gt;
plt.ylabel('Temperatura Máxima alcanzada')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Categoría:EDP]]&lt;br /&gt;
[[Categoría:EDP25/26]]&lt;/div&gt;</summary>
		<author><name>Álvaro Moreno</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/wiki/Ecuaci%C3%B3n_del_calor_LAJS</id>
		<title>Ecuación del calor LAJS</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/wiki/Ecuaci%C3%B3n_del_calor_LAJS"/>
				<updated>2026-04-02T16:50:56Z</updated>
		
		<summary type="html">&lt;p&gt;Sofía: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
{{ TrabajoED | Ecuación del calor. Grupo LAJS | [[:Categoría:EDP|EDP]]|[[:Categoría:EDP25/26|2025-26]] | Leire Aparicio Urbiola&lt;br /&gt;
&lt;br /&gt;
Álvaro Silva Blanco &lt;br /&gt;
&lt;br /&gt;
Julia Calado Bonnin&lt;br /&gt;
&lt;br /&gt;
Sofía García Suárez&lt;br /&gt;
&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Categoría:EDP]]&lt;br /&gt;
[[Categoría:EDP25/26]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Póster ==&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Poster_Calor_LAJS.png||900px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Introducción ==&lt;br /&gt;
&lt;br /&gt;
El estudio de la ecuación del calor es fundamental a la hora de estudiar cómo la temperatura se distribuye en un cuerpo a lo largo del tiempo mediante procesos de difusión. En este trabajo, nos centramos en el análisis de una varilla metálica unidimensional de longitud $L=1$. El objetivo principal será comprender propiedades clave como la convergencia al estado estacionario, la influencia de las condiciones de contorno (Dirichlet y Neumann) y el comportamiento de la solución ante datos iniciales discontinuos. A través de la resolución por separación de variables y la implementación de códigos en MATLAB, ilustraremos fenómenos como el fenómeno de Gibbs y la velocidad infinita de propagación. Además, analizaremos la sensibilidad del sistema frente a cambios en la conductividad térmica, evaluando cómo este parámetro altera la tasa de decaimiento temporal de las soluciones.&lt;br /&gt;
&lt;br /&gt;
== Planteamiento y solución del problema ==&lt;br /&gt;
&lt;br /&gt;
Comenzamos considerando una varilla metálica que ocupa el intervalo &amp;lt;math&amp;gt;[0, 1]&amp;lt;/math&amp;gt; y que se encuentra aislada por su superficie lateral, de forma que la conducción de calor únicamente ocurre en dirección longitudinal. La temperatura inicial de la varilla será de &amp;lt;math&amp;gt;10ºC&amp;lt;/math&amp;gt;. En el extremo derecho la temperatura se mantiene en &amp;lt;math&amp;gt;10ºC&amp;lt;/math&amp;gt;, mientras que en el izquierdo la temperatura es siempre de &amp;lt;math&amp;gt;1ºC&amp;lt;/math&amp;gt;. Por tanto, si consideramos las constantes de conductividad térmica y calor específico iguales a uno, la ecuación que modeliza nuestro problema queda &amp;lt;math&amp;gt;u_t - u_{xx}=0, \quad x \in (0,1), \ t &amp;gt; 0&amp;lt;/math&amp;gt;, sujeta a las condiciones de contorno &amp;lt;math&amp;gt;u(0,t) = 1&amp;lt;/math&amp;gt; (extremo izquierdo) y &amp;lt;math&amp;gt;u(1,t) = 10&amp;lt;/math&amp;gt; (extremo derecho). Por último, la condición inicial será &amp;lt;math&amp;gt;u(x,0) = 10 \quad \forall x \in [0,1]&amp;lt;/math&amp;gt;. El sistema de EDPs que modeliza nuestro problema queda:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;\begin{cases} &lt;br /&gt;
        u_t - u_{xx}=0 &amp;amp; \text{en } (0,1) \times (0, \infty) \\[10pt]&lt;br /&gt;
        u(0,t) = 1 &amp;amp; t &amp;gt; 0 \\[5pt]&lt;br /&gt;
        u(1,t) = 10 &amp;amp; t &amp;gt; 0 \\[5pt]&lt;br /&gt;
        u(x,0) = 10 &amp;amp; x \in [0,1]&lt;br /&gt;
        \end{cases}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Solución estacionaria =====&lt;br /&gt;
&lt;br /&gt;
En cuanto a la ecuación del estado estacionario, sabemos que ocurre al suponer &amp;lt;math&amp;gt;t \to \infty &amp;lt;/math&amp;gt; y que por tanto la solución ya no varía en tiempo, es decir, cuando &amp;lt;math&amp;gt; u_t \sim 0 &amp;lt;/math&amp;gt;. Entonces el problema para la solución estacionaria es &lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;\begin{cases} &lt;br /&gt;
        - v_{xx}=0 &amp;amp; \text{en } (0,1) \\[10pt]&lt;br /&gt;
        v(0) = 1  \\[5pt]&lt;br /&gt;
        v(1) = 10 &lt;br /&gt;
        \end{cases}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lo que nos da una EDO que se resuelve fácilmente y se llega a la solución &amp;lt;math&amp;gt; v(x)=9x+1 &amp;lt;/math&amp;gt;. En la siguiente imagen podemos ver la gráfica de esta solución, que representa la temperatura que observaríamos si dejáramos pasar mucho tiempo bajo las condiciones descritas.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:SolEstacionaria.png|thumb|300px|Visualización de la solución estacionaria]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Solución del problema y visualización ====&lt;br /&gt;
&lt;br /&gt;
A continuación hallamos la solución al problema original, que lo haremos por el método de separación de variables. La forma de resolverlo es considerando la solución como la suma del estado estacionario y una solución transitoria &amp;lt;math&amp;gt;w(x,t)&amp;lt;/math&amp;gt; que cumple condiciones de contorno, es decir, &amp;lt;math&amp;gt;u(x,t) = v(x) + w(x,t)&amp;lt;/math&amp;gt;. La parte &amp;lt;math&amp;gt;w(x,t)&amp;lt;/math&amp;gt; se calcula mediante la serie de Fourier &amp;lt;math&amp;gt;w(x,t) = \sum_{n=1}^{\infty} b_n e^{-(n\pi)^2 t} \sin(n\pi x)&amp;lt;/math&amp;gt;, donde los coeficientes &amp;lt;math&amp;gt;b_n&amp;lt;/math&amp;gt; se calculan a partir de la condición inicial &amp;lt;math&amp;gt;w(x,0) = u(x,0) - v(x) = 10 - (9x + 1) = 9 - 9x&amp;lt;/math&amp;gt;. La solución final a nuestro problema es:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;u(x,t) = (9x + 1) + \sum_{n=1}^{\infty} \left( \frac{18}{n\pi} \right) e^{-(n\pi)^2 t} \sin(n\pi x)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para la visualización de esta solución hemos creado un código en Matlab que nos da una gráfica tridimensional, que utiliza los primeros 10 términos de la serie de Fourier en el intervalo de tiempo [0, 1]. En la imagen que genera el código podemos observar que el extremo derecho de la varilla comienza en una temperatura de &amp;lt;math&amp;gt;10^{\circ}C&amp;lt;/math&amp;gt;, y sin embargo, en el extremo izquierdo la temperatura cae hasta &amp;lt;math&amp;gt;1^{\circ}C&amp;lt;/math&amp;gt;. Además se observa el fenómeno de Gibbs en la gráfica: las oscilaciones que se ven cerca de &amp;lt;math&amp;gt;t=0&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;x=0&amp;lt;/math&amp;gt; son una consecuencia de usar solo 10 términos de la serie de Fourier. Al intentar aproximar una discontinuidad (el salto de &amp;lt;math&amp;gt;10^{\circ}C&amp;lt;/math&amp;gt; a &amp;lt;math&amp;gt;1^{\circ}C&amp;lt;/math&amp;gt;), aparecen estas oscilaciones que desaparecen a medida que el tiempo avanza y la solución se suaviza. Se aprecia que cerca de &amp;lt;math&amp;gt;t=1&amp;lt;/math&amp;gt;, la superficie es prácticamente una superficie plana inclinada, lo que indica que el sistema ha alcanzado o está muy cerca de su estado estacionario.&lt;br /&gt;
&lt;br /&gt;
{{matlab|codigo=&lt;br /&gt;
% Parámetros iniciales&lt;br /&gt;
L = 1;  &lt;br /&gt;
t_final = 1;&lt;br /&gt;
Nx = 50;            &lt;br /&gt;
Nt = 50;            &lt;br /&gt;
&lt;br /&gt;
x = linspace(0, L, Nx);&lt;br /&gt;
t = linspace(0, t_final, Nt);&lt;br /&gt;
[X, T] = meshgrid(x, t);&lt;br /&gt;
&lt;br /&gt;
% Solución estacionaria: v = 9x + 1 &lt;br /&gt;
V = 9*X + 1;&lt;br /&gt;
&lt;br /&gt;
% Parte transitoria: suma de los primeros 10 términos de Fourier &lt;br /&gt;
W = zeros(size(X));&lt;br /&gt;
for n = 1:10&lt;br /&gt;
    bn = 18 / (n * pi);&lt;br /&gt;
    W = W + bn * exp(-(n*pi)^2 * T) .* sin(n*pi * X);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% Solución final: u(x,t) = v(x) + w(x,t) &lt;br /&gt;
U = V + W;&lt;br /&gt;
&lt;br /&gt;
% Gráfica&lt;br /&gt;
figure;&lt;br /&gt;
surf(X, T, U);&lt;br /&gt;
shading interp; % Suaviza los colores&lt;br /&gt;
colorbar;&lt;br /&gt;
title('Evolución de la Temperatura (Primeros 10 términos)');&lt;br /&gt;
xlabel('Posición (x)');&lt;br /&gt;
ylabel('Tiempo (t)');&lt;br /&gt;
zlabel('Temperatura (u)');&lt;br /&gt;
grid on;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Archivo:SolGrafica.png|centro|400px|Gráfica de la solución]]&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Estudio del flujo de calor en los extremos ==&lt;br /&gt;
&lt;br /&gt;
Para analizar el flujo de calor en los extremos de la barra a lo largo del tiempo utilizamos la ley de Fourier, que asegura que el flujo es proporcional al gradiente de temperatura: &amp;lt;math&amp;gt;q = -k u_x&amp;lt;/math&amp;gt;. Como en el problema hemos asumido que la conductividad térmica era uno, resulta que el flujo es igual a la derivada espacial evaluada en los bordes de la barra. La derivada respecto de &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; que obtuvimos antes es:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;u_x = 9 + \sum_{n=1}^{\infty} b_n n\pi e^{-(n\pi)^2 t} \cos(n\pi x)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
De nuevo, hemos desarrollado un código en Matlab para dibujar la evolución del flujo entrante y saliente. De la imagen que nos devuelve el código podemos interpretar varias cosas: en primer lugar, vemos que ambos flujos convergen al valor 9, lo que tiene sentido porque antes hemos calculado que la solución estacionaria era &amp;lt;math&amp;gt;v(x)=9x+1&amp;lt;/math&amp;gt;. Además en &amp;lt;math&amp;gt;x=0&amp;lt;/math&amp;gt; el flujo es muy elevado, y esto se debe a que, como la barra está a &amp;lt;math&amp;gt;10 \circ C&amp;lt;/math&amp;gt; en un extremo y a &amp;lt;math&amp;gt;1 \circ C&amp;lt;/math&amp;gt; en el otro, hay una salida muy fuerte de energía hacia el exterior por la parte izquierda de la barra. De la misma manera, en el extremo derecho inicialmente el flujo es cercano a cero porque la barra y el borde están a la misma temperatura, y el flujo empieza a variar cuando el enfriamiento de la izquierda llega al lado derecho. Esta gráfica está relacionada con la que hemos visto antes: el flujo es la pendiente de la superficie que hemos dibujado antes.&lt;br /&gt;
&lt;br /&gt;
{{matlab|codigo=&lt;br /&gt;
% Parámetros&lt;br /&gt;
L = 1;&lt;br /&gt;
t = linspace(0.01, 1, 100); % Mejor evitar t=0 por la discontinuidad inicial&lt;br /&gt;
flujo0 = zeros(size(t));&lt;br /&gt;
flujo1 = zeros(size(t));&lt;br /&gt;
&lt;br /&gt;
% Cálculo de los flujos usando 10 términos&lt;br /&gt;
for i = 1:length(t)&lt;br /&gt;
    sum_i = 0;&lt;br /&gt;
    sum_d = 0;&lt;br /&gt;
    for n = 1:10&lt;br /&gt;
        bn = 18 / (n * pi);&lt;br /&gt;
        term_base = bn * (n * pi) * exp(-(n*pi)^2 * t(i));&lt;br /&gt;
        sum_i = sum_i + term_base * cos(0);          % cos(n*pi*0) = 1&lt;br /&gt;
        sum_d = sum_d + term_base * cos(n * pi);     % cos(n*pi) = (-1)^n&lt;br /&gt;
    end&lt;br /&gt;
    flujo0(i) = 9 + sum_i;&lt;br /&gt;
    flujo1(i) = 9 + sum_d;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% Gráfica&lt;br /&gt;
figure;&lt;br /&gt;
plot(t, flujo0, 'b', 'LineWidth', 2); hold on;&lt;br /&gt;
plot(t, flujo1, 'r', 'LineWidth', 2);&lt;br /&gt;
grid on;&lt;br /&gt;
legend('Flujo en x=0 ', 'Flujo en x=1');&lt;br /&gt;
title('Flujo de calor en los extremos a lo largo del tiempo');&lt;br /&gt;
xlabel('Tiempo (t)');&lt;br /&gt;
ylabel('Gradiente de Temperatura u_x');&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Flujoo1.jpg|centro|300px|Flujo de calor]]&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Efecto de cambiar la conductividad ==&lt;br /&gt;
&lt;br /&gt;
Ahora vamos a cambiar la conductividad térmica de la varilla de &amp;lt;math&amp;gt;\alpha=1&amp;lt;/math&amp;gt; a &amp;lt;math&amp;gt;\alpha=1/2&amp;lt;/math&amp;gt;. Esto quiere decir que ahora el calor se mueve de manera más lenta a lo largo de la varilla y que por tanto se tardará más en llegar al estado estacionario. Entonces tenemos que con este cambio la nueva ecuación del calor es:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;u_t - \frac{1}{2}u_{xx}=0&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La nueva solución es muy parecida a la de antes:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;u(x,t) = (9x + 1) + \sum_{n=1}^{\infty} \left( \frac{18}{n\pi} \right) e^{-\frac{(n\pi)^2 t}{2}} \sin(n\pi x)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pero ahora la varilla tarda más en calentarse o enfriarse en cada punto, es decir, la solución se aproxima más despacio al estado estacionario. &lt;br /&gt;
&lt;br /&gt;
Para compararlas, hemos creado un código en Matlab donde calcularemos las dos soluciones  (&amp;lt;math&amp;gt;\alpha=1&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;\alpha=1/2&amp;lt;/math&amp;gt;) usando los primeros 10 términos de la serie&lt;br /&gt;
&lt;br /&gt;
{{matlab|codigo=&lt;br /&gt;
L = 1; t_final = 1; Nx = 60; Nt = 60;&lt;br /&gt;
x = linspace(0, L, Nx);&lt;br /&gt;
t = linspace(0, t_final, Nt);&lt;br /&gt;
[X, T] = meshgrid(x, t);&lt;br /&gt;
&lt;br /&gt;
% Estado Estacionario &lt;br /&gt;
V1 = 9*X + 1; &lt;br /&gt;
V2 = 9*0.5 + 1; % Valor en x=0.5&lt;br /&gt;
&lt;br /&gt;
% Cálculo de la serie de Fourier para ambos coeficientes&lt;br /&gt;
W1 = zeros(size(X)); &lt;br /&gt;
W2 = zeros(size(X)); &lt;br /&gt;
&lt;br /&gt;
for n = 1:10&lt;br /&gt;
    bn = 18 / (n * pi);&lt;br /&gt;
    % Caso alpha = 1&lt;br /&gt;
    W1 = W1 + bn * exp(-(n*pi)^2 * T) .* sin(n*pi * X);&lt;br /&gt;
    % Caso alpha = 1/2&lt;br /&gt;
    W2 = W2 + bn * exp(-0.5 * (n*pi)^2 * T) .* sin(n*pi * X);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
U1 = V1 + W1;&lt;br /&gt;
U2 = V1 + W2;&lt;br /&gt;
&lt;br /&gt;
% Grafica 1 (superficies 3D)&lt;br /&gt;
figure('Units', 'normalized', 'Position', [0.1, 0.2, 0.8, 0.4]);&lt;br /&gt;
&lt;br /&gt;
subplot(1,2,1);&lt;br /&gt;
surf(X, T, U1); shading interp; colorbar;&lt;br /&gt;
title('Solución con \alpha = 1');&lt;br /&gt;
xlabel('Posición (x)'); ylabel('Tiempo (t)'); zlabel('Temp (u)');&lt;br /&gt;
&lt;br /&gt;
subplot(1,2,2);&lt;br /&gt;
surf(X, T, U2); shading interp; colorbar;&lt;br /&gt;
title('Solución con \alpha = 1/2');&lt;br /&gt;
xlabel('Posición (x)'); ylabel('Tiempo (t)'); zlabel('Temp (u)');&lt;br /&gt;
&lt;br /&gt;
% Gráfica de diferencias en el punto medio ---&lt;br /&gt;
x_idx = round(Nx/2); % Índice correspondiente a x=0.5&lt;br /&gt;
dif1 = U1(:, x_idx) - V2;&lt;br /&gt;
dif2 = U2(:, x_idx) - V2;&lt;br /&gt;
&lt;br /&gt;
figure;&lt;br /&gt;
plot(t, dif1, 'b', 'LineWidth', 2); hold on;&lt;br /&gt;
plot(t, dif2, 'r', 'LineWidth', 2);&lt;br /&gt;
grid on;&lt;br /&gt;
title('Diferencia: u(1/2, t) - v(1/2)');&lt;br /&gt;
xlabel('Tiempo (t)'); ylabel('Temperatura (ºC)');&lt;br /&gt;
legend('\alpha = 1', '\alpha = 1/2');&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[Archivo:ComparaSuperf.jpg|izquierda|650px|Comparación de las conductividades térmicas]]&lt;br /&gt;
[[Archivo:ComparaP.jpg|derecha|350px|Comparación entre la solución y el estado estacionario]]&lt;br /&gt;
&lt;br /&gt;
== Efecto de un dato inicial discontinuo ==&lt;br /&gt;
&lt;br /&gt;
Ahora vamos a estudiar la ecuación del calor cuando cambiamos la temperatura inicial de la varilla. Tenemos que ambos extremos se mantienen a temperatura constante &amp;lt;math&amp;gt;10ºC&amp;lt;/math&amp;gt;, y la temperatura inicial viene dado por la función:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;u_0(x)=10-10 \,\ \mathbf{1}_{[1/3,2/3]}(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Esto significa que la varilla comienza a &amp;lt;math&amp;gt;10ºC&amp;lt;/math&amp;gt; excepto en el segmento central &amp;lt;math&amp;gt;[1/3,2/3]&amp;lt;/math&amp;gt;, donde la temperatura inicial es &amp;lt;math&amp;gt;0ºC&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
El sistema de EDPs que modela el comportamiento de la temperatura  &amp;lt;math&amp;gt;u(x,t)&amp;lt;/math&amp;gt; es el siguiente:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;\begin{cases} &lt;br /&gt;
        u_t - u_{xx}=0 &amp;amp; \text{en } (0,1) \times (0, \infty) \\[10pt]&lt;br /&gt;
        u(0,t) = 10 &amp;amp; t &amp;gt; 0 \\[5pt]&lt;br /&gt;
        u(1,t) = 10 &amp;amp; t &amp;gt; 0 \\[5pt]&lt;br /&gt;
        u(x,0) = 10-10 \,\ \mathbf{1}_{[1/3,2/3]}(x) &amp;amp; x \in [0,1]&lt;br /&gt;
        \end{cases}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Solución estacionaria====&lt;br /&gt;
&lt;br /&gt;
El estado estacionario se obtiene imponiendo que la temperatura no depende del tiempo. Entonces el problema para la solución estacionaria es:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;\begin{cases} &lt;br /&gt;
        - v_{xx}=0 \\[10pt]&lt;br /&gt;
        v(0) = 10  \\[5pt]&lt;br /&gt;
        v(1) = 10 &lt;br /&gt;
        \end{cases}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
La solución general es &amp;lt;math&amp;gt;v(x)=Ax+B&amp;lt;/math&amp;gt;. Aplicamos las condiciones de contorno y obtenemos que &amp;lt;math&amp;gt;B=10 &amp;lt;/math&amp;gt;,  &amp;lt;math&amp;gt;A=0 &amp;lt;/math&amp;gt;. Por tanto, la solución es simplemente &amp;lt;math&amp;gt;v(x)=10 &amp;lt;/math&amp;gt;, lo cual tiene sentido ya que como ambos extremos están a la misma temperatura, el estado de equilibrio es una temperatura uniforme en toda la varilla.&lt;br /&gt;
&lt;br /&gt;
==== Solución del problema y visualización ====&lt;br /&gt;
&lt;br /&gt;
Ahora vamos a encontrar la solución al problema original utilizando el método de separación de variables. Se define el cambio variable &amp;lt;math&amp;gt;w(x,t)=u(x)-v(x,t)=u(x,t)-10&amp;lt;/math&amp;gt;, que satisface la ecuación de calor con condiciones de contorno homogéneas &amp;lt;math&amp;gt; w(0,t)=w(1,t)=0 &amp;lt;/math&amp;gt; y dato inicial  &amp;lt;math&amp;gt;w(x,0) = u(x,0) - v(x) = - 10 \, \mathbf{1}_{[1/3,2/3]}(x)&amp;lt;/math&amp;gt;. La solución por separación de variables es:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt; u(x,t) = 10+  \sum_{n=1}^{\infty} b_n e^{-(n\pi)^2 t} \sin(n\pi x) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Podemos calcular los coeficientes de Fourier de manera analítica, pero en este apartado nos piden aproximar los coeficientes. El siguiente código de Matlab aproxima los coeficientes integrando numéricamente mediante la regla del trapecio y representa la solución &amp;lt;math&amp;gt; u(x,t) &amp;lt;/math&amp;gt; como superficie tridimensional:&lt;br /&gt;
&lt;br /&gt;
{{matlab|codigo=&lt;br /&gt;
x = linspace(0,1,200);&lt;br /&gt;
t = linspace(0,1,100);&lt;br /&gt;
[X,T] = meshgrid(x,t);&lt;br /&gt;
&lt;br /&gt;
u = 10*ones(size(X)); % parte estacionaria&lt;br /&gt;
&lt;br /&gt;
for n=1:10&lt;br /&gt;
    f = @(x) -10*(x&amp;gt;=1/3 &amp;amp; x&amp;lt;=2/3).*sin(n*pi*x);&lt;br /&gt;
    bn = 2*trapz(x,f(x));&lt;br /&gt;
    &lt;br /&gt;
    u = u + bn*sin(n*pi*X).*exp(-n^2*pi^2*T);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
surf(X,T,u)&lt;br /&gt;
shading interp&lt;br /&gt;
xlabel('x')&lt;br /&gt;
ylabel('t')&lt;br /&gt;
zlabel('u(x,t)')&lt;br /&gt;
title('Evolución de la temperatura')&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[Archivo: Evoluciontemp.jpg|centro|400px|Gráfica de la solución]]&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En &amp;lt;math&amp;gt;t=0&amp;lt;/math&amp;gt; podemos ver que el intervalo &amp;lt;math&amp;gt; [1/3,2/3] &amp;lt;/math&amp;gt; está a &amp;lt;math&amp;gt; 0ºC &amp;lt;/math&amp;gt; mientras que el resto de la varilla está a &amp;lt;math&amp;gt; 10ºC &amp;lt;/math&amp;gt;. A medida que &amp;lt;math&amp;gt; t &amp;lt;/math&amp;gt; crece, el calor se va distribuyendo por toda la barra hasta alcanzar la temperatura uniforme &amp;lt;math&amp;gt; v(x)=10 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Cambiamos condiciones frontera ==&lt;br /&gt;
&lt;br /&gt;
Al estar el extremo izquierdo (&amp;lt;math&amp;gt;x=0&amp;lt;/math&amp;gt;) aislado térmicamente, el flujo de calor en ese punto es cero, lo que se traduce en una condición de contorno de Neumann (&amp;lt;math&amp;gt;u_x(0,t) = 0&amp;lt;/math&amp;gt;). El extremo derecho (&amp;lt;math&amp;gt;x=1&amp;lt;/math&amp;gt;) se mantiene a &amp;lt;math&amp;gt;10^\circ C&amp;lt;/math&amp;gt;. La condición inicial sigue siendo la del apartado 7.&lt;br /&gt;
&lt;br /&gt;
El sistema de la EDP queda así:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \begin{cases}&lt;br /&gt;
u_t = u_{xx}, \quad x \in (0,1), \ t &amp;gt; 0 \\&lt;br /&gt;
u_x(0,t) = 0 \\&lt;br /&gt;
u(1,t) = 10 \\&lt;br /&gt;
u(x,0) = 10-10 \,\ \mathbf{1}_{[1/3,2/3]}(x) &amp;amp; x \in [0,1]&lt;br /&gt;
\end{cases} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Solución estacionaria'''&lt;br /&gt;
&lt;br /&gt;
La solución del estado estacionario &amp;lt;math&amp;gt;v(x)&amp;lt;/math&amp;gt; no depende del tiempo, obteniéndose el problema &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \begin{cases}&lt;br /&gt;
-v_{xx}=0\\&lt;br /&gt;
v(0) = 0 \\&lt;br /&gt;
v(1) = 10 &lt;br /&gt;
\end{cases} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Luego, resolviendo el problema con las condiciones iniciales dadas, se obtiene que la solución estacionaria es&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;v(x) = 10&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Solución para el sistema homogéneo'''&lt;br /&gt;
&lt;br /&gt;
Aplicamos separación de variables para el problema homogéneo, donde obtenemos que los autovalores son &amp;lt;math&amp;gt;\lambda_n = \left(\frac{(2n-1)\pi}{2}\right)^2&amp;lt;/math&amp;gt; y la nueva base de autofunciones es:&lt;br /&gt;
:&amp;lt;math&amp;gt;X_n(x) = \cos\left(\frac{(2n-1)\pi}{2} x\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Comprobación analítica de la ortogonalidad'''&lt;br /&gt;
&lt;br /&gt;
El enunciado pide comprobar explícitamente que estas autofunciones son ortogonales en &amp;lt;math&amp;gt;[0,1]&amp;lt;/math&amp;gt;. Debemos demostrar que para &amp;lt;math&amp;gt;n \neq m&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\int_0^1 \cos\left(\frac{(2n-1)\pi}{2} x\right) \cos\left(\frac{(2m-1)\pi}{2} x\right) dx = 0&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Usamos la identidad trigonométrica &amp;lt;math&amp;gt;\cos(A)\cos(B) = \frac{1}{2}[\cos(A+B) + \cos(A-B)]&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;I = \frac{1}{2} \int_0^1 \left[ \cos\left( \frac{(2n+2m-2)\pi}{2} x \right) + \cos\left( \frac{(2n-2m)\pi}{2} x \right) \right] dx&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;I = \frac{1}{2} \int_0^1 \left[ \cos((n+m-1)\pi x) + \cos((n-m)\pi x) \right] dx&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Al integrar y evaluar entre 0 y 1:&lt;br /&gt;
:&amp;lt;math&amp;gt;I = \frac{1}{2} \left[ \frac{\sin((n+m-1)\pi x)}{(n+m-1)\pi} + \frac{\sin((n-m)\pi x)}{(n-m)\pi} \right]_0^1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sustituyendo &amp;lt;math&amp;gt;x=1&amp;lt;/math&amp;gt;, el seno de cualquier múltiplo entero de &amp;lt;math&amp;gt;\pi&amp;lt;/math&amp;gt; es siempre 0. Al evaluar en &amp;lt;math&amp;gt;x=0&amp;lt;/math&amp;gt;, los senos también son 0. Por tanto, &amp;lt;math&amp;gt;I = 0&amp;lt;/math&amp;gt;, quedando demostrada analíticamente su ortogonalidad.&lt;br /&gt;
&lt;br /&gt;
''' Solución y cálculo de coeficientes'''&lt;br /&gt;
&lt;br /&gt;
La solución temporal es &amp;lt;math&amp;gt;T_n(t) = e^{-\left(\frac{(2n-1)\pi}{2}\right)^2 t}&amp;lt;/math&amp;gt;. Superponiendo todas las soluciones, recuperamos &amp;lt;math&amp;gt;u(x,t)&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;u(x,t) = 10 + \sum_{n=1}^{\infty} c_n \cos\left(\frac{(2n-1)\pi}{2} x\right) e^{-\left(\frac{(2n-1)\pi}{2}\right)^2 t}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Como realizamos en el apartado anterior, aproximamos los coeficientes de Fourier numéricamente. La integral exacta para nuestra nueva base es:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;c_n = 2 \int_0^1 v(x,0) \cos\left(\frac{(2n-1)\pi}{2} x\right) dx&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Esta integral la aproximaremos utilizando las funciones de cuadratura incluidas en Matlab. Además, igual que en los apartados anteriores representaremos la solución tridimensional utilizando el código que muestra a continuación:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
Nx = 100; % Subintervalos en x&lt;br /&gt;
Nt = 100; % Subintervalos en t&lt;br /&gt;
x = linspace(0, 1, Nx+1);&lt;br /&gt;
t = linspace(0, 1, Nt+1);&lt;br /&gt;
&lt;br /&gt;
[X, T] = meshgrid(x, t); &lt;br /&gt;
&lt;br /&gt;
% Condición inicial transitoria v(x,0)&lt;br /&gt;
v0 = zeros(1, length(x));&lt;br /&gt;
v0(x &amp;gt;= 1/3 &amp;amp; x &amp;lt;= 2/3) = -10; &lt;br /&gt;
&lt;br /&gt;
% Coeficientes de Fourier &lt;br /&gt;
num_terminos = 10;&lt;br /&gt;
c = zeros(1, num_terminos);&lt;br /&gt;
&lt;br /&gt;
for n = 1:num_terminos&lt;br /&gt;
    % Autofunciones&lt;br /&gt;
    mu_n = (2*n - 1) * pi / 2;&lt;br /&gt;
    &lt;br /&gt;
    % Función a integrar&lt;br /&gt;
    fx = v0 .* cos(mu_n * x);&lt;br /&gt;
    &lt;br /&gt;
    % Cuadratura con la regla del trapecio&lt;br /&gt;
    c(n) = 2 * trapz(x, fx);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% Solución&lt;br /&gt;
U_transitoria = zeros(size(X));&lt;br /&gt;
&lt;br /&gt;
% Sumamos los primeros 10 términos de la serie&lt;br /&gt;
for n = 1:num_terminos&lt;br /&gt;
    mu_n = (2*n - 1) * pi / 2;&lt;br /&gt;
    termino_n = c(n) * cos(mu_n * X) .* exp(-(mu_n^2) * T);&lt;br /&gt;
    U_transitoria = U_transitoria + termino_n;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% La solución total es la suma de la parte transitoria y el estado estacionario&lt;br /&gt;
U_total = 10 + U_transitoria;&lt;br /&gt;
&lt;br /&gt;
% Representación tridimensional&lt;br /&gt;
figure;&lt;br /&gt;
surf(X, T, U_total, 'EdgeColor', 'none');&lt;br /&gt;
colormap jet; &lt;br /&gt;
colorbar;    &lt;br /&gt;
xlabel('Posición x');&lt;br /&gt;
ylabel('Tiempo t');&lt;br /&gt;
zlabel('Temperatura u(x,t)');&lt;br /&gt;
title('Evolución de la temperatura u(x,t)');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Archivo:grafica_calor_apartado8.png|centro|400px|Gráfica de la solución]]&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==  Principio del máximo ==&lt;br /&gt;
&lt;br /&gt;
El principio del máximo para la ecuación del calor nos dice que los valores máximos y mínimos de la solución en el dominio se alcanzan en la frontera parabólica, es decir, en las condiciones iniciales o en las de contorno.&lt;br /&gt;
&lt;br /&gt;
En nuestro caso tenemos que las condiciones de contorno son:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; u(0,t)=u(1,t)=10 &amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
y el dato inicial cumple que:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; 0 \leq u_0(x) \leq 10&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Por tanto, todos los valores de la solución en la frontera están entre 0 y 10. Aplicando el principio del máximo, tenemos que:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; 0 \leq u(x,t) \leq 10 \text{ para todo } x\in [0,1], t&amp;gt;0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Principio de comparación ==&lt;br /&gt;
&lt;br /&gt;
El principio de comparación para la ecuación del calor establece que si tenemos dos soluciones &amp;lt;math&amp;gt;u(x,t)&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;v(x,t)&amp;lt;/math&amp;gt; definidas en un dominio &amp;lt;math&amp;gt;[0,1] \times [0,T]&amp;lt;/math&amp;gt;, y se cumple que &amp;lt;math&amp;gt;u \le v&amp;lt;/math&amp;gt; en la '''frontera parabólica''' (es decir, en la condición inicial &amp;lt;math&amp;gt;t=0&amp;lt;/math&amp;gt; y en los extremos &amp;lt;math&amp;gt;x=0&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;x=1&amp;lt;/math&amp;gt;), entonces &amp;lt;math&amp;gt;u(x,t) \le v(x,t)&amp;lt;/math&amp;gt; en todo el dominio para cualquier &amp;lt;math&amp;gt;t &amp;gt; 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Para ilustrar este principio, vamos a elegir dos soluciones analíticas sencillas de la ecuación del calor homogénea (&amp;lt;math&amp;gt;u_t = u_{xx}&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;v_t = v_{xx}&amp;lt;/math&amp;gt;) que cumplan estas condiciones.&lt;br /&gt;
&lt;br /&gt;
'''Elección de las soluciones:'''&lt;br /&gt;
* '''Solución 1 (&amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;):''' Elegimos una condición inicial &amp;lt;math&amp;gt;u(x,0) = \sin(\pi x)&amp;lt;/math&amp;gt; con extremos fijos a temperatura cero (&amp;lt;math&amp;gt;u(0,t) = u(1,t) = 0&amp;lt;/math&amp;gt;). Su solución exacta es un único término de la serie de Fourier:&lt;br /&gt;
:: &amp;lt;math&amp;gt;u(x,t) = \sin(\pi x) e^{-\pi^2 t}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''Solución 2 (&amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;):''' Elegimos una condición inicial que sea el doble de la anterior, &amp;lt;math&amp;gt;v(x,0) = 2\sin(\pi x)&amp;lt;/math&amp;gt;, también con extremos a cero (&amp;lt;math&amp;gt;v(0,t) = v(1,t) = 0&amp;lt;/math&amp;gt;). Su solución exacta es:&lt;br /&gt;
:: &amp;lt;math&amp;gt;v(x,t) = 2\sin(\pi x) e^{-\pi^2 t}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Comprobación en la frontera parabólica:'''&lt;br /&gt;
1. En &amp;lt;math&amp;gt;t = 0&amp;lt;/math&amp;gt;: Como &amp;lt;math&amp;gt;x \in [0,1]&amp;lt;/math&amp;gt;, el seno siempre es positivo. Por tanto, &amp;lt;math&amp;gt;\sin(\pi x) \le 2\sin(\pi x)&amp;lt;/math&amp;gt;, lo que implica &amp;lt;math&amp;gt;u(x,0) \le v(x,0)&amp;lt;/math&amp;gt;.&lt;br /&gt;
2. En &amp;lt;math&amp;gt;x = 0&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;x = 1&amp;lt;/math&amp;gt;: Se cumple que &amp;lt;math&amp;gt;0 \le 0&amp;lt;/math&amp;gt;, por lo que &amp;lt;math&amp;gt;u(0,t) \le v(0,t)&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;u(1,t) \le v(1,t)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Dado que &amp;lt;math&amp;gt;u \le v&amp;lt;/math&amp;gt; en toda la frontera parabólica, el principio de comparación asegura que la superficie de &amp;lt;math&amp;gt;u(x,t)&amp;lt;/math&amp;gt; estará siempre por debajo de la superficie de &amp;lt;math&amp;gt;v(x,t)&amp;lt;/math&amp;gt;.&lt;/div&gt;</summary>
		<author><name>Leire Aparicio</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/wiki/Ecuaci%C3%B3n_del_calor_(LAJS)</id>
		<title>Ecuación del calor (LAJS)</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/wiki/Ecuaci%C3%B3n_del_calor_(LAJS)"/>
				<updated>2026-04-02T12:26:50Z</updated>
		
		<summary type="html">&lt;p&gt;Álvaro Silva: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
== Póster ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Introducción ==&lt;/div&gt;</summary>
		<author><name>Álvaro Silva</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/wiki/Series_de_Fourier(PDM)</id>
		<title>Series de Fourier(PDM)</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/wiki/Series_de_Fourier(PDM)"/>
				<updated>2026-02-18T23:52:00Z</updated>
		
		<summary type="html">&lt;p&gt;DiegoGR: /* Poster */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ TrabajoED | Series de Fourier(DPM)| [[:Categoría:EDP|EDP]]|[[:Categoría:EDP25/26|2025-26]] | Diego García Raposo&lt;br /&gt;
&lt;br /&gt;
Paula Dopico Muñoz&lt;br /&gt;
&lt;br /&gt;
Manuel Herreros Zarco}}&lt;br /&gt;
&lt;br /&gt;
==Series de Fourier==&lt;br /&gt;
&lt;br /&gt;
===Poster===&lt;br /&gt;
[[Archivo:PosterFInal VF(1).png|center|800px]]]]&lt;br /&gt;
&lt;br /&gt;
===Códigos===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
T = 1.0 ### Longitud del intervalo&lt;br /&gt;
n_max = 3  # La frecuencua hasta la que pinta senos y cosenos para representar la base lineal&lt;br /&gt;
M = 3000 ### Número de puntos en X&lt;br /&gt;
&lt;br /&gt;
x = np.linspace(-T, T, M) ### Genera un vector de M puntos entre -T y T&lt;br /&gt;
&lt;br /&gt;
plt.figure(figsize=(10,5)) ### Tamaño de la gráfica, pa q sea grande o chiquita pero no afecta a los puntos&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
phi0 = (1/np.sqrt(2*T)) * np.ones_like(x) ### Genera un vector de 3000 ptos con cada uno la función cte de la basepara luego representarlo&lt;br /&gt;
plt.plot(x, phi0, linewidth=3) ### Pinta la linea generada por la función phi0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
for n in range(1, n_max + 1): ### Pinta las funciones seno y coseno asociadas a cada frecuencia en el plot&lt;br /&gt;
    phi_c = (1/np.sqrt(T)) * np.cos(n*np.pi*x/T) ### funcion coseno&lt;br /&gt;
    phi_s = (1/np.sqrt(T)) * np.sin(n*np.pi*x/T) ### funcion seno&lt;br /&gt;
    &lt;br /&gt;
    plt.plot(x, phi_c)&lt;br /&gt;
    plt.plot(x, phi_s) &lt;br /&gt;
&lt;br /&gt;
plt.title(&amp;quot;Base trigonométrica ortonormal en [-T, T]&amp;quot;) ### SIstema de representación de python&lt;br /&gt;
plt.xlabel(&amp;quot;x&amp;quot;)&lt;br /&gt;
plt.grid(True)&lt;br /&gt;
plt.tight_layout()&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#nuevo código&lt;br /&gt;
import math&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# --------- función de ejemplo ----------&lt;br /&gt;
def f(x):&lt;br /&gt;
    return x   # cambia aquí si quieres&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# --------- coeficientes numéricos ----------&lt;br /&gt;
def fourier_coeffs_numeric(L, N, M=20000):&lt;br /&gt;
    xs = np.linspace(0.0, L, M)&lt;br /&gt;
    fx = f(xs)&lt;br /&gt;
&lt;br /&gt;
    a0 = (2.0 / L) * np.trapz(fx, xs)&lt;br /&gt;
&lt;br /&gt;
    a = np.zeros(N + 1)&lt;br /&gt;
    b = np.zeros(N + 1)&lt;br /&gt;
&lt;br /&gt;
    for n in range(1, N + 1):&lt;br /&gt;
        c = np.cos(2.0 * math.pi * n * xs / L)&lt;br /&gt;
        s = np.sin(2.0 * math.pi * n * xs / L)&lt;br /&gt;
&lt;br /&gt;
        a[n] = (2.0 / L) * np.trapz(fx * c, xs)&lt;br /&gt;
        b[n] = (2.0 / L) * np.trapz(fx * s, xs)&lt;br /&gt;
&lt;br /&gt;
    return a0, a, b&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def S_N(x, L, N, a0, a, b):&lt;br /&gt;
    val = a0 / 2.0&lt;br /&gt;
    for n in range(1, N + 1):&lt;br /&gt;
        val += (&lt;br /&gt;
            a[n] * np.cos(2.0 * math.pi * n * x / L)&lt;br /&gt;
            + b[n] * np.sin(2.0 * math.pi * n * x / L)&lt;br /&gt;
        )&lt;br /&gt;
    return val&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# --------- visualizar error en muchos puntos ----------&lt;br /&gt;
def visualize_error(Ls, N, num_points=500):&lt;br /&gt;
&lt;br /&gt;
    xs = np.linspace(0.001, min(Ls), num_points)  # intervalo común&lt;br /&gt;
&lt;br /&gt;
    plt.figure()&lt;br /&gt;
&lt;br /&gt;
    for L in Ls:&lt;br /&gt;
&lt;br /&gt;
        a0, a, b = fourier_coeffs_numeric(L, N)&lt;br /&gt;
&lt;br /&gt;
        approx = S_N(xs, L, N, a0, a, b)&lt;br /&gt;
        exact = f(xs)&lt;br /&gt;
&lt;br /&gt;
        error = np.abs(approx - exact)&lt;br /&gt;
&lt;br /&gt;
        plt.plot(xs, error, label=f&amp;quot;L={L}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    plt.yscale(&amp;quot;log&amp;quot;)&lt;br /&gt;
    plt.xlabel(&amp;quot;x&amp;quot;)&lt;br /&gt;
    plt.ylabel(&amp;quot;|S_N(x) - f(x)|&amp;quot;)&lt;br /&gt;
    plt.title(f&amp;quot;Error puntual para N={N}&amp;quot;)&lt;br /&gt;
    plt.legend()&lt;br /&gt;
    plt.grid(True, which=&amp;quot;both&amp;quot;)&lt;br /&gt;
    plt.show()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
    Ls = [1.0, 4.0]&lt;br /&gt;
    N = 20&lt;br /&gt;
&lt;br /&gt;
    visualize_error(Ls, N, num_points=800)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#nuevo código&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
# =====================================================&lt;br /&gt;
# 1) INTERVALO Y FUNCIÓN&lt;br /&gt;
# =====================================================&lt;br /&gt;
a, b = 0.0, 1.0 ### Inicio y final del intervalo&lt;br /&gt;
L = b - a ### Longitud intervalo&lt;br /&gt;
&lt;br /&gt;
def f(x):&lt;br /&gt;
    return np.where((x &amp;gt;= 0.0) &amp;amp; (x &amp;lt; 0.5), 1.0, 0.0) ### Funcion indicatriz &lt;br /&gt;
&lt;br /&gt;
# =====================================================&lt;br /&gt;
# 2) MUESTREO&lt;br /&gt;
# =====================================================&lt;br /&gt;
M = 8192 ### Numero de puntos en x&lt;br /&gt;
x = np.linspace(a, b, M, endpoint=False) ### Genera un vector de M puntos entre a y b, pero no incluye el punto b&lt;br /&gt;
fx = f(x) ### Aplica la función a cada elementos del vector del linspace x tanto es un vector de lomgitud M&lt;br /&gt;
&lt;br /&gt;
# =====================================================&lt;br /&gt;
# 3) COEFICIENTES REALES DIRECTOS (SIN FFT)&lt;br /&gt;
# =====================================================&lt;br /&gt;
def coeffs_real_direct(fx, N, a=0.0, L=1.0):&lt;br /&gt;
    M = fx.size&lt;br /&gt;
    j = np.arange(M)&lt;br /&gt;
    xj = a + L*j/M  # mismos puntos que linspace(endpoint=False)&lt;br /&gt;
&lt;br /&gt;
    a0 = fx.mean()  # (1/M) sum f_j&lt;br /&gt;
&lt;br /&gt;
    k = np.arange(1, N+1) ### np array, es decir una lista de las frecuencias ordenadas desde 0 hasta N, siendo N la mayor de la suma parcial deseada&lt;br /&gt;
    theta = 2*np.pi * k[:, None] * (xj[None, :] - a) / L ### Crea una matriz donde el elemento Aij es 2*pi*k_i*x_j&lt;br /&gt;
&lt;br /&gt;
    ak = (2/M) * (fx[None, :] * np.cos(theta)).sum(axis=1) ### Calcula un vector donde cada elemento es el coeficiente asociado a la frecuencua ki&lt;br /&gt;
    bk = (2/M) * (fx[None, :] * np.sin(theta)).sum(axis=1) ### Lo mismo pero el seno&lt;br /&gt;
&lt;br /&gt;
    return a0, ak, bk&lt;br /&gt;
&lt;br /&gt;
# =====================================================&lt;br /&gt;
# 4) RECONSTRUCCIÓN S_N EN BASE REAL&lt;br /&gt;
# =====================================================&lt;br /&gt;
def partial_sum_real_direct(N, x, fx, a=0.0, L=1.0):&lt;br /&gt;
    a0, ak, bk = coeffs_real_direct(fx, N, a=a, L=L)&lt;br /&gt;
&lt;br /&gt;
    k = np.arange(1, N+1) ### Vector de frecuencias &lt;br /&gt;
    theta = 2*np.pi * k[:, None] * (x[None, :] - a) / L ### Genera una matriz elemento Aij es igual que antes pero con el cambio de intervalo para poder aplicar fourier&lt;br /&gt;
&lt;br /&gt;
    sN = a0 \&lt;br /&gt;
         + (ak[:, None] * np.cos(theta)).sum(axis=0) \ ### multiplica cada coeficiente con su coseno respectivo, en forma de vector por cada punto del linspace&lt;br /&gt;
         + (bk[:, None] * np.sin(theta)).sum(axis=0)   ### lo mismo para el seno&lt;br /&gt;
&lt;br /&gt;
    return sN ### devuelve la serie de fourier&lt;br /&gt;
&lt;br /&gt;
# =====================================================&lt;br /&gt;
# 5) VISUALIZACIÓN&lt;br /&gt;
# =====================================================&lt;br /&gt;
Ns = [1, 3, 5, 10, 40, 80] ### Representación python&lt;br /&gt;
&lt;br /&gt;
cols = 3&lt;br /&gt;
rows = (len(Ns) + cols - 1) // cols&lt;br /&gt;
&lt;br /&gt;
fig, axes = plt.subplots(rows, cols, figsize=(12, 3*rows))&lt;br /&gt;
axes = axes.flatten()&lt;br /&gt;
&lt;br /&gt;
for i, N in enumerate(Ns):&lt;br /&gt;
    sN = partial_sum_real_direct(N, x, fx, a=a, L=L)&lt;br /&gt;
&lt;br /&gt;
    axes[i].plot(x, fx, color='black', linewidth=2, label=&amp;quot;f(x)&amp;quot;)&lt;br /&gt;
    axes[i].plot(x, sN, color='red', linewidth=1.6, label=&amp;quot;S_N(x) (sin FFT)&amp;quot;)&lt;br /&gt;
    axes[i].set_title(f&amp;quot;N = {N}&amp;quot;)&lt;br /&gt;
    axes[i].grid(True)&lt;br /&gt;
&lt;br /&gt;
    if i == 0:&lt;br /&gt;
        axes[i].legend(loc=&amp;quot;best&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
# Quitar paneles vacíos&lt;br /&gt;
for j in range(i+1, len(axes)):&lt;br /&gt;
    fig.delaxes(axes[j])&lt;br /&gt;
&lt;br /&gt;
plt.tight_layout()&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#nuevo código&lt;br /&gt;
&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
# =====================================================&lt;br /&gt;
# CONFIG&lt;br /&gt;
# =====================================================&lt;br /&gt;
a, b = 0.0, 1.0&lt;br /&gt;
L = b - a&lt;br /&gt;
&lt;br /&gt;
M_fft = 8192&lt;br /&gt;
h_L2 = 1e-5&lt;br /&gt;
Ns = [1, 2, 4, 8, 16, 32, 64, 128, 256, 512]&lt;br /&gt;
&lt;br /&gt;
m_max = 3  # vamos a construir f0, f1, f2, f3 a mano&lt;br /&gt;
&lt;br /&gt;
# =====================================================&lt;br /&gt;
# 1) f0 y sus primitivas exactas f1,f2,f3&lt;br /&gt;
# =====================================================&lt;br /&gt;
def f0(x):&lt;br /&gt;
    return np.where((x &amp;gt;= 0.0) &amp;amp; (x &amp;lt; 0.5), 1.0, 0.0)&lt;br /&gt;
&lt;br /&gt;
def f1(x):&lt;br /&gt;
    # ∫0^x f0(t) dt&lt;br /&gt;
    return np.where(x &amp;lt; 0.5, x, 0.5)&lt;br /&gt;
&lt;br /&gt;
def f2(x):&lt;br /&gt;
    # ∫0^x f1(t) dt&lt;br /&gt;
    # x&amp;lt;0.5: x^2/2&lt;br /&gt;
    # x&amp;gt;=0.5: (1/2)x - 1/8&lt;br /&gt;
    return np.where(x &amp;lt; 0.5, 0.5*x**2, 0.5*x - 0.125)&lt;br /&gt;
&lt;br /&gt;
def f3(x):&lt;br /&gt;
    # ∫0^x f2(t) dt&lt;br /&gt;
    # x&amp;lt;0.5: x^3/6&lt;br /&gt;
    # x&amp;gt;=0.5: (1/4)x^2 - (1/8)x + 1/48&lt;br /&gt;
    return np.where(x &amp;lt; 0.5, (x**3)/6.0, 0.25*x**2 - 0.125*x + (1.0/48.0))&lt;br /&gt;
&lt;br /&gt;
f_funcs = [f0, f1, f2, f3]  # lista de funciones exactas&lt;br /&gt;
&lt;br /&gt;
# =====================================================&lt;br /&gt;
# 2) MALLAS Y VALORES &amp;quot;TRUE&amp;quot; EN L2&lt;br /&gt;
# =====================================================&lt;br /&gt;
x_L2 = np.arange(a, b, h_L2)&lt;br /&gt;
f_list = [f_funcs[m](x_L2) for m in range(m_max + 1)]  # f0..f3 evaluadas en x_L2&lt;br /&gt;
&lt;br /&gt;
# =====================================================&lt;br /&gt;
# 3) Fourier por FFT sobre una malla uniforme para coeficientes&lt;br /&gt;
#    (ojo: extensión periódica implícita de lo que haya en [0,1))&lt;br /&gt;
# =====================================================&lt;br /&gt;
x_fft = np.linspace(a, b, M_fft, endpoint=False)&lt;br /&gt;
&lt;br /&gt;
def fourier_coeffs_up_to_from_samples(fx_samples):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    Devuelve coeffs_up_to(N) -&amp;gt; (a0, ak, bk) para:&lt;br /&gt;
    f(x) ~ a0 + sum_{k=1}^N [ak cos(2πk(x-a)/L) + bk sin(2πk(x-a)/L)].&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    C = np.fft.fft(fx_samples) / M_fft&lt;br /&gt;
    a0 = C[0].real&lt;br /&gt;
&lt;br /&gt;
    def coeffs_up_to(N):&lt;br /&gt;
        ck = C[1:N+1]&lt;br /&gt;
        ak = 2.0 * ck.real&lt;br /&gt;
        bk = -2.0 * ck.imag&lt;br /&gt;
        return a0, ak, bk&lt;br /&gt;
&lt;br /&gt;
    return coeffs_up_to&lt;br /&gt;
&lt;br /&gt;
def partial_sum_real(coeffs_up_to, N, xgrid):&lt;br /&gt;
    a0, ak, bk = coeffs_up_to(N)&lt;br /&gt;
    s = a0 * np.ones_like(xgrid, dtype=float)&lt;br /&gt;
    for k in range(1, N+1):&lt;br /&gt;
        ang = 2*np.pi*k*(xgrid - a)/L&lt;br /&gt;
        s += ak[k-1]*np.cos(ang) + bk[k-1]*np.sin(ang)&lt;br /&gt;
    return s&lt;br /&gt;
&lt;br /&gt;
def L2_error(f_true_vals, s_vals, xgrid):&lt;br /&gt;
    e = f_true_vals - s_vals&lt;br /&gt;
    return np.sqrt(np.trapz(e**2, xgrid))&lt;br /&gt;
&lt;br /&gt;
# Precomputamos coeffs_up_to para cada m (muestreando en x_fft)&lt;br /&gt;
coeffs_list = []&lt;br /&gt;
for m in range(m_max + 1):&lt;br /&gt;
    f_m_on_fft = f_funcs[m](x_fft)  # como es explícita, no hace falta interp&lt;br /&gt;
    coeffs_list.append(fourier_coeffs_up_to_from_samples(f_m_on_fft))&lt;br /&gt;
&lt;br /&gt;
# =====================================================&lt;br /&gt;
# 4) EXPERIMENTO: error L2 vs N para cada m&lt;br /&gt;
# =====================================================&lt;br /&gt;
plt.figure(figsize=(7,5))&lt;br /&gt;
&lt;br /&gt;
for m in range(m_max + 1):&lt;br /&gt;
    f_true = f_list[m]&lt;br /&gt;
    coeffs_up_to = coeffs_list[m]&lt;br /&gt;
    E = []&lt;br /&gt;
    for N in Ns:&lt;br /&gt;
        sN = partial_sum_real(coeffs_up_to, N, x_L2)&lt;br /&gt;
        E.append(L2_error(f_true, sN, x_L2))&lt;br /&gt;
    plt.loglog(Ns, E, marker='o', label=f&amp;quot;m={m} (f_{m} exacta)&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
plt.grid(True, which=&amp;quot;both&amp;quot;)&lt;br /&gt;
plt.xlabel(&amp;quot;N&amp;quot;)&lt;br /&gt;
plt.ylabel(r&amp;quot;$\|f_m - S_N\|_{L^2(0,1)}$&amp;quot;)&lt;br /&gt;
plt.title(&amp;quot;Convergencia L2 vs N usando primitivas EXACTAS (sin integrar numéricamente)&amp;quot;)&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.tight_layout()&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
# =====================================================&lt;br /&gt;
# 5) Visualización de f_m exactas&lt;br /&gt;
# =====================================================&lt;br /&gt;
fig, axes = plt.subplots(m_max + 1, 1, figsize=(9, 2.4*(m_max+1)))&lt;br /&gt;
if m_max == 0:&lt;br /&gt;
    axes = [axes]&lt;br /&gt;
&lt;br /&gt;
for m in range(m_max + 1):&lt;br /&gt;
    axes[m].plot(x_L2, f_list[m], linewidth=1.8)&lt;br /&gt;
    axes[m].grid(True)&lt;br /&gt;
    axes[m].set_title(f&amp;quot;f_{m}(x) exacta (integración aplicada {m} veces)&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
plt.tight_layout()&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
[[Categoría:EDP]]&lt;br /&gt;
[[Categoría:EDP25/26]]&lt;/div&gt;</summary>
		<author><name>DiegoGR</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/wiki/Series_de_funciones_SAL</id>
		<title>Series de funciones SAL</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/wiki/Series_de_funciones_SAL"/>
				<updated>2026-02-18T23:11:01Z</updated>
		
		<summary type="html">&lt;p&gt;Angela Marquet: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ TrabajoED | Series de Fourier. Grupo SAL | [[:Categoría:EDP|EDP]]|[[:Categoría:EDP25/26|2025-26]] | Sergio Maccanin &lt;br /&gt;
&lt;br /&gt;
Ángela Marquet &lt;br /&gt;
&lt;br /&gt;
Luis Zulueta  }}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Archivo: Poster_SeriesFourier.png|800px]]&lt;br /&gt;
[[Archivo: Poster_SeriesFourier SAL.pdf]]&lt;br /&gt;
&lt;br /&gt;
En la sección siguiente se pueden leer los códigos utilizados para generar las gráficas observadas en el póster. &lt;br /&gt;
&lt;br /&gt;
==CÓDIGO 1== &lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
import math&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
import numpy as np&lt;br /&gt;
Nmax=1000 #si se quiere ver mejor el error tomar números muy grandes de Nmax y pequeños de esp.&lt;br /&gt;
esp=20&lt;br /&gt;
cmap = plt.cm.viridis&lt;br /&gt;
colors = cmap(np.linspace(0, 1, Nmax//esp))&lt;br /&gt;
lin=1000&lt;br /&gt;
listax=[]&lt;br /&gt;
x = np.linspace(-math.pi, math.pi, lin)&lt;br /&gt;
N=0&lt;br /&gt;
Fsum=0&lt;br /&gt;
plt.figure(figsize=(10,6), dpi=600)&lt;br /&gt;
ldiff=[]&lt;br /&gt;
ftr = np.piecewise(x,&lt;br /&gt;
                 [x &amp;lt; -np.pi/2, (x &amp;gt;= -np.pi/2) &amp;amp; (x &amp;lt; 0), (x &amp;gt;= 0) &amp;amp; (x &amp;lt; np.pi/2),(x &amp;gt;= np.pi/2) &amp;amp; (x &amp;lt; np.pi)],&lt;br /&gt;
                 [1,-1,1,-1])&lt;br /&gt;
lista2=[]&lt;br /&gt;
&lt;br /&gt;
for i in ftr:&lt;br /&gt;
    lista2+=[i]&lt;br /&gt;
for j in range(Nmax//esp):&lt;br /&gt;
    N+=esp&lt;br /&gt;
    for i in range(N-1):&lt;br /&gt;
        n=i+1&lt;br /&gt;
        bn = 2*(1+(-1)**(n)-2*math.cos(n*math.pi/2))/n&lt;br /&gt;
        Fsum=bn*np.sin(n*x) + Fsum&lt;br /&gt;
    Fsum=Fsum/np.pi&lt;br /&gt;
    plt.plot(x, Fsum, color=colors[j])&lt;br /&gt;
    lista1=[]&lt;br /&gt;
    if N&amp;gt;20000:&lt;br /&gt;
        for i in Fsum:&lt;br /&gt;
            lista1+=[i]&lt;br /&gt;
        diff=0&lt;br /&gt;
        for i in range(len(lista1)):&lt;br /&gt;
            diff+=abs(lista1[i]-lista2[i])&lt;br /&gt;
        ldiff+=[diff]&lt;br /&gt;
        listax+=[N]&lt;br /&gt;
    Fsum=0&lt;br /&gt;
plt.plot(x,ftr,color=&amp;quot;red&amp;quot;)&lt;br /&gt;
plt.show()&lt;br /&gt;
plt.figure(figsize=(10,6), dpi=600)&lt;br /&gt;
plt.plot(listax,ldiff)&lt;br /&gt;
plt.xlabel(&amp;quot;Número de elementos de la serie&amp;quot;)&lt;br /&gt;
plt.ylabel('|Sn-f|')&lt;br /&gt;
plt.show&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==CÓDIGO 2== &lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import math&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
import numpy as np&lt;br /&gt;
Nmax=1000&lt;br /&gt;
esp=20&lt;br /&gt;
cmap = plt.cm.viridis&lt;br /&gt;
colors = cmap(np.linspace(0, 1, Nmax//esp))&lt;br /&gt;
lin=1000&lt;br /&gt;
listax=[]&lt;br /&gt;
x = np.linspace(-math.pi, math.pi, lin)&lt;br /&gt;
N=0&lt;br /&gt;
Fsum=0&lt;br /&gt;
plt.figure(figsize=(10,6), dpi=600)&lt;br /&gt;
ldiff=[]&lt;br /&gt;
ftr = abs(x)&lt;br /&gt;
lista2=[]&lt;br /&gt;
for i in ftr:&lt;br /&gt;
    lista2+=[i]&lt;br /&gt;
for j in range(Nmax//esp):&lt;br /&gt;
    N+=esp&lt;br /&gt;
    for i in range(N-1):&lt;br /&gt;
        n=i+1&lt;br /&gt;
        bn = 2*(np.cos(np.pi*n)-1)/(n**2)&lt;br /&gt;
        Fsum=bn*np.cos(n*x) + Fsum&lt;br /&gt;
    Fsum=Fsum/np.pi +np.pi/2&lt;br /&gt;
    plt.plot(x, Fsum, color=colors[j])&lt;br /&gt;
    lista1=[]&lt;br /&gt;
    if N&amp;gt;20000:&lt;br /&gt;
        for i in Fsum:&lt;br /&gt;
            lista1+=[i]&lt;br /&gt;
        diff=0&lt;br /&gt;
        for i in range(len(lista1)):&lt;br /&gt;
            diff+=abs(lista1[i]-lista2[i])&lt;br /&gt;
        ldiff+=[diff]&lt;br /&gt;
        listax+=[N]&lt;br /&gt;
    Fsum=0&lt;br /&gt;
plt.plot(x,ftr,color=&amp;quot;red&amp;quot;)&lt;br /&gt;
plt.show()&lt;br /&gt;
plt.figure(figsize=(10,6), dpi=600)&lt;br /&gt;
plt.plot(listax,ldiff)&lt;br /&gt;
plt.xlabel(&amp;quot;Número de elementos de la serie&amp;quot;)&lt;br /&gt;
plt.ylabel('|Sn-f|')&lt;br /&gt;
plt.show&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==CÓDIGO 3== &lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import math&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
import numpy as np&lt;br /&gt;
Nmax=5000&lt;br /&gt;
esp=10&lt;br /&gt;
cmap = plt.cm.viridis&lt;br /&gt;
colors = cmap(np.linspace(0, 1, Nmax//esp))&lt;br /&gt;
lin=1000&lt;br /&gt;
listax=[]&lt;br /&gt;
x = np.linspace(-math.pi, math.pi, lin)&lt;br /&gt;
N=0&lt;br /&gt;
Fsum=0&lt;br /&gt;
plt.figure(figsize=(10,6), dpi=600)&lt;br /&gt;
ldiff=[]&lt;br /&gt;
ftr = x&lt;br /&gt;
lista2=[]&lt;br /&gt;
for i in ftr:&lt;br /&gt;
    lista2+=[i]&lt;br /&gt;
for j in range(Nmax//esp):&lt;br /&gt;
    N+=esp&lt;br /&gt;
    for i in range(N-1):&lt;br /&gt;
        n=i+1&lt;br /&gt;
        bn = (2*np.pi*(-1)**(n+1))/n&lt;br /&gt;
        Fsum=bn*np.sin(n*x) + Fsum&lt;br /&gt;
    Fsum=Fsum/np.pi&lt;br /&gt;
    plt.plot(x, Fsum, color=colors[j])&lt;br /&gt;
    lista1=[]&lt;br /&gt;
    if N&amp;gt;80:&lt;br /&gt;
        for i in Fsum:&lt;br /&gt;
            lista1+=[i]&lt;br /&gt;
        diff=0&lt;br /&gt;
        for i in range(len(lista1)):&lt;br /&gt;
            diff+=abs(lista1[i]-lista2[i])&lt;br /&gt;
        ldiff+=[diff]&lt;br /&gt;
    Fsum=0&lt;br /&gt;
plt.plot(x,ftr,color=&amp;quot;red&amp;quot;)&lt;br /&gt;
plt.show()&lt;br /&gt;
plt.figure(figsize=(10,6), dpi=600)&lt;br /&gt;
plt.plot(listax,ldiff)&lt;br /&gt;
plt.xlabel(&amp;quot;Número de elementos de la serie&amp;quot;)&lt;br /&gt;
plt.ylabel('|Sn-f|')&lt;br /&gt;
plt.show&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Categoría:EDP]]&lt;br /&gt;
[[Categoría:EDP25/26]]&lt;/div&gt;</summary>
		<author><name>Angela Marquet</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/wiki/Series_de_Fourier_DFN</id>
		<title>Series de Fourier DFN</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/wiki/Series_de_Fourier_DFN"/>
				<updated>2026-02-18T23:09:23Z</updated>
		
		<summary type="html">&lt;p&gt;Daniel Tormos: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=[[Archivo:Poster DFN.pdf|miniaturadeimagen|Póster]]=&lt;br /&gt;
{{ TrabajoED | Series de Fourier. Grupo DFN | [[:Categoría:EDP|EDP]]|[[:Categoría:EDP25/26|2025-26]] | Daniel Tormos&lt;br /&gt;
&lt;br /&gt;
Fernando Madrid&lt;br /&gt;
&lt;br /&gt;
Nicolás Sánchez  }}&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
=Funciones =&lt;br /&gt;
&lt;br /&gt;
Esta primera función calcula los coeficientes de Fourier de manera aleatoria en base a una función f.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang: &amp;quot;Matlab&amp;quot; line&amp;gt;&lt;br /&gt;
function [coefs] = rand_coefs(f,N)&lt;br /&gt;
    % Crea un vector de N elementos con coeficientes a_i aleatorios entre&lt;br /&gt;
    % f(i) y -f(i).&lt;br /&gt;
    coefs = zeros(N,1);&lt;br /&gt;
    for i = 1:N&lt;br /&gt;
        coefs(i) = rand*2*f(i)-f(i);&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Esta función genera la Serie de Fourier a partir de sus coeficientes.&lt;br /&gt;
&amp;lt;source lang: &amp;quot;Matlab&amp;quot; line&amp;gt;&lt;br /&gt;
function [F] = generar_F(a,b)&lt;br /&gt;
    % Genera una función F a partir de sus coeficientes de Fourier.&lt;br /&gt;
    &lt;br /&gt;
    % a son los N+1 coeficientes para los elementos pares de la base&lt;br /&gt;
    % trigonométrica en [-pi,pi], y b son los N coeficientes de los &lt;br /&gt;
    % elementos impares.&lt;br /&gt;
&lt;br /&gt;
    N = length(b);&lt;br /&gt;
    n = (1:N)';  % Vector columna&lt;br /&gt;
    a = a(:);    % Asegurar que a es columna&lt;br /&gt;
    b = b(:);    % Asegurar que b es columna&lt;br /&gt;
    &lt;br /&gt;
    F = @(x) (a(1)/sqrt(2*pi)) + sum((a(n+1)/sqrt(pi)).*cos(n*x) + (b(n)/sqrt(pi)).*sin(n*x), 1);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Con esto creamos una lista de series de Fourier.&lt;br /&gt;
&amp;lt;source lang: &amp;quot;Matlab&amp;quot; line&amp;gt;&lt;br /&gt;
function [coefs, funciones] = familia_funciones(f,N,Num)&lt;br /&gt;
    % f,N son las entradas para rand_coefs&lt;br /&gt;
    % Num es el número de funciones de la familia&lt;br /&gt;
&lt;br /&gt;
    % Devuelve:&lt;br /&gt;
&lt;br /&gt;
    % Una lista de parejas de vectores de coeficientes a y b. Para&lt;br /&gt;
    % obtener los coeficientes impares de la funcion 3 (por ejemplo),&lt;br /&gt;
    % llamas coefs(3).b&lt;br /&gt;
&lt;br /&gt;
    % Una lista de funciones. Para obtener la función 3, llamas&lt;br /&gt;
    % funciones{3}&lt;br /&gt;
&lt;br /&gt;
    coefs(Num) = struct('a',[],'b',[]);&lt;br /&gt;
    funciones = cell(1,Num);&lt;br /&gt;
    for i = 1:Num&lt;br /&gt;
        coefs(i).a = rand_coefs(f,N+1);&lt;br /&gt;
        coefs(i).b = rand_coefs(f,N);&lt;br /&gt;
        funciones{i} = generar_F(coefs(i).a,coefs(i).b); &lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Códigos=&lt;br /&gt;
En esta primera hacemos los cálculos de media, varianza y covarianza.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang: &amp;quot;Matlab&amp;quot; line&amp;gt;&lt;br /&gt;
&lt;br /&gt;
f1 = @(x) 1./(x.^2); f2 = @(x) 1./x; f3 = @(x) 1/sqrt(x);&lt;br /&gt;
N = 500;&lt;br /&gt;
Num = 1e5;&lt;br /&gt;
[coefs,funciones] = familia_funciones(f2,N,Num); % Elegir la f_i que se quiera&lt;br /&gt;
x1 = 1; x2 = 0.2; % Distintos puntos&lt;br /&gt;
Sum_1 = 0;&lt;br /&gt;
Sum_2 = 0;&lt;br /&gt;
for i =1:Num&lt;br /&gt;
    Sum_1 = Sum_1 + funciones{i}(x1);&lt;br /&gt;
    Sum_2 = Sum_2 + funciones{i}(x2);&lt;br /&gt;
end&lt;br /&gt;
mean1 = (1/Num)*Sum_1&lt;br /&gt;
mean2 = (1/Num)*Sum_2&lt;br /&gt;
media_metodo_A = mean1;&lt;br /&gt;
&lt;br /&gt;
S1 = 0;&lt;br /&gt;
S2 = 0;&lt;br /&gt;
C = 0;&lt;br /&gt;
for i =1:Num&lt;br /&gt;
    S1 = S1 + (funciones{i}(x1)-mean1)^2;&lt;br /&gt;
    S2 = S2 + (funciones{i}(x2)-mean2)^2;&lt;br /&gt;
    C = C + (funciones{i}(x1)-mean1)*(funciones{i}(x2)-mean2);&lt;br /&gt;
end&lt;br /&gt;
VAR1 = (1/(Num-1))*S1&lt;br /&gt;
VAR2 = (1/(Num-1))*S2&lt;br /&gt;
COV = (1/(Num-1))*C&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang: &amp;quot;Matlab&amp;quot; line&amp;gt;&lt;br /&gt;
&lt;br /&gt;
f1 = @(x) 1./(x.^(2)); f2 = @(x) 1./x; f3 = @(x) 1/sqrt(x);&lt;br /&gt;
N = 100;&lt;br /&gt;
a1 = rand_coefs(f1,N+1); b1 = rand_coefs(f1,N);&lt;br /&gt;
a2 = rand_coefs(f2,N+1); b2 = rand_coefs(f2,N);&lt;br /&gt;
a3 = rand_coefs(f3,N+1); b3 = rand_coefs(f3,N);&lt;br /&gt;
F1 = generar_F(a1,b1); F2 = generar_F(a2,b2); F3 = generar_F(a3,b3);&lt;br /&gt;
x = linspace(-pi,pi,600);&lt;br /&gt;
P = linspace(-pi,pi,300);&lt;br /&gt;
&lt;br /&gt;
V=zeros(1000,3);&lt;br /&gt;
&lt;br /&gt;
for i=1:1000&lt;br /&gt;
&lt;br /&gt;
    for k=1:length(P)-1&lt;br /&gt;
        V(i,1)=V(i,1)+abs(F1(P(k))-F1(P(k+1)));&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    for k=1:length(P)-1&lt;br /&gt;
        V(i,2)=V(i,2)+abs(F2(P(k))-F2(P(k+1)));&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    for k=1:length(P)-1&lt;br /&gt;
        V(i,3)=V(i,3)+abs(F3(P(k))-F3(P(k+1)));&lt;br /&gt;
    end&lt;br /&gt;
    a1 = rand_coefs(f1,N+1); b1 = rand_coefs(f1,N);&lt;br /&gt;
    a2 = rand_coefs(f2,N+1); b2 = rand_coefs(f2,N);&lt;br /&gt;
    a3 = rand_coefs(f3,N+1); b3 = rand_coefs(f3,N);&lt;br /&gt;
    F1 = generar_F(a1,b1); F2 = generar_F(a2,b2); F3 = generar_F(a3,b3);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
tablaResultados = table(mean(V)', min(V)', max(V)', std(V)', ...&lt;br /&gt;
    'VariableNames', {'Media', 'Minimo', 'Maximo', 'Desviacion Tipica' }, ...&lt;br /&gt;
    'RowNames', {'Funcion 1', 'Funcion 2', 'Funcion 3'});&lt;br /&gt;
&lt;br /&gt;
 plot(x,F1(x));&lt;br /&gt;
 hold on&lt;br /&gt;
 plot(x,F2(x));&lt;br /&gt;
 plot(x,F3(x));&lt;br /&gt;
 legend &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Categoría:EDP]]&lt;br /&gt;
[[Categoría:EDP25/26]]&lt;/div&gt;</summary>
		<author><name>Fernando Madrid</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/wiki/Series_de_Fourier_CCP</id>
		<title>Series de Fourier CCP</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/wiki/Series_de_Fourier_CCP"/>
				<updated>2026-02-18T22:22:16Z</updated>
		
		<summary type="html">&lt;p&gt;Claudia.pozurama: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
{{ TrabajoED | Series de Fourier. Grupo 6-A | [[Categoría:EDP]][[Categoría:EDP25/26]] | Paula Blanco · Covadonga Díaz · Claudia Pozurama }}&lt;br /&gt;
&lt;br /&gt;
== Póster ==&lt;br /&gt;
[[Media:Poster (4).pdf|Descargar póster (PDF)]]&lt;br /&gt;
&lt;br /&gt;
== Códigos ==&lt;br /&gt;
[[Media:Códigos edp entregar.pdf|Descargar códigos (PDF)]]&lt;/div&gt;</summary>
		<author><name>Claudia.pozurama</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/wiki/Series_de_Fourier_JC</id>
		<title>Series de Fourier JC</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/wiki/Series_de_Fourier_JC"/>
				<updated>2026-02-18T21:34:32Z</updated>
		
		<summary type="html">&lt;p&gt;Javier Martínez Saiz: /* Póster */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ TrabajoED | Series de Fourier. Grupo 6-A | [[:Categoría:EDP|EDP]]|[[:Categoría:EDP25/26|2025-26]] | Carlos Asensio &lt;br /&gt;
&lt;br /&gt;
Javier Martínez }}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Póster ==&lt;br /&gt;
[[Archivo:EDPS_POSTER_1.pdf]]&lt;br /&gt;
[[Archivo:EDPS_POSTER_2.jpg|center|800px]]&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
=CODIGO 1 =&lt;br /&gt;
&amp;lt;source lang: &amp;quot;Matlab&amp;quot; line&amp;gt;&lt;br /&gt;
%% Histograma Adaptativo según Desviación Típica en un punto x&lt;br /&gt;
&lt;br /&gt;
clear; clc; close all;&lt;br /&gt;
&lt;br /&gt;
% 1. Parámetros de Control&lt;br /&gt;
L = 1;              &lt;br /&gt;
N_harmonicos = 500;  &lt;br /&gt;
M_iter = 3000; &lt;br /&gt;
x_fijo = 0.5;       &lt;br /&gt;
omega = 2 * pi / L;&lt;br /&gt;
p=2;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
% 2. Definición de la desviación típica por modo&lt;br /&gt;
k = 1:N_harmonicos;&lt;br /&gt;
sigma_k = 1 ./ (k.^(p/2)); &lt;br /&gt;
&lt;br /&gt;
% 3. Simulación de Monte Carlo&lt;br /&gt;
valores_f = zeros(1, M_iter);&lt;br /&gt;
for m = 1:M_iter&lt;br /&gt;
    ak = randn(1, N_harmonicos) .* sigma_k;&lt;br /&gt;
    bk = randn(1, N_harmonicos) .* sigma_k;&lt;br /&gt;
    &lt;br /&gt;
    % Evaluamos la serie en x_fijo&lt;br /&gt;
    f_x = sum( ak .* cos(k * omega * x_fijo) + bk .* sin(k * omega * x_fijo) );&lt;br /&gt;
    valores_f(m) = f_x;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% 4. Cálculo de la Varianza Teórica &lt;br /&gt;
% La varianza de la suma es la suma de las varianzas de los sumandos&lt;br /&gt;
&lt;br /&gt;
var_teorica_adaptada = sum(sigma_k.^2); &lt;br /&gt;
&lt;br /&gt;
% 5. Representación Gráfica&lt;br /&gt;
figure('Color', 'w');&lt;br /&gt;
h = histogram(valores_f, 50, 'Normalization', 'pdf', 'FaceColor', [0.2, 0.7, 0.5], 'EdgeColor', 'none');&lt;br /&gt;
hold on;&lt;br /&gt;
&lt;br /&gt;
% Generar Gaussiana basada en la varianza calculada&lt;br /&gt;
x_axis = linspace(min(valores_f), max(valores_f), 200);&lt;br /&gt;
y_gauss = (1/sqrt(2*pi*var_teorica_adaptada)) * exp(-x_axis.^2 / (2*var_teorica_adaptada));&lt;br /&gt;
&lt;br /&gt;
plot(x_axis, y_gauss, 'r', 'LineWidth', 2.5);&lt;br /&gt;
&lt;br /&gt;
title(['Distribución Adaptada: \sigma_{total}^2 = ', num2str(var_teorica_adaptada, '%.4f')]);&lt;br /&gt;
subtitle(['Parámetros: p = ', num2str(p)]);&lt;br /&gt;
xlabel(['Valor de f(x) en x = ', num2str(x_fijo)]);&lt;br /&gt;
ylabel('Densidad de Probabilidad');&lt;br /&gt;
legend('Simulación', 'Gaussiana Teórica Adaptada');&lt;br /&gt;
grid on;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
fprintf('Varianza Teórica Calculada: %f\n', var_teorica_adaptada);&lt;br /&gt;
fprintf('Varianza Observada: %f\n', var(valores_f));&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=CODIGO 2 =&lt;br /&gt;
&amp;lt;source lang: &amp;quot;Matlab&amp;quot; line&amp;gt;&lt;br /&gt;
%% Simulación de Función Aleatoria con coeficientes normales.&lt;br /&gt;
&lt;br /&gt;
% 1. Parámetros&lt;br /&gt;
L = 1;              % Longitud del dominio&lt;br /&gt;
N = 500;            % Número de armónicos&lt;br /&gt;
dx = 0.001;&lt;br /&gt;
x = 0:dx:L;&lt;br /&gt;
f = zeros(size(x));&lt;br /&gt;
p=8;&lt;br /&gt;
&lt;br /&gt;
% 2. Generación de Coeficientes&lt;br /&gt;
% Introducimos la desviación típica (raiz de la varianza) &lt;br /&gt;
k = 1:N;&lt;br /&gt;
sigma_k = 1./k.^(p/2); &lt;br /&gt;
&lt;br /&gt;
% Coeficientes: Normal(0, 1) multiplicada por su desviación estándar&lt;br /&gt;
ak = randn(1, N) .* sigma_k;&lt;br /&gt;
bk = randn(1, N) .* sigma_k;&lt;br /&gt;
&lt;br /&gt;
% 3. Construcción de la Serie&lt;br /&gt;
omega = 2 * pi / L;&lt;br /&gt;
for i = 1:N&lt;br /&gt;
    f = f + ak(i)*cos(i*omega*x) + bk(i)*sin(i*omega*x);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% 4. Representación Gráfica&lt;br /&gt;
figure('Color', 'w');&lt;br /&gt;
plot(x, f, 'LineWidth', 1.5, 'Color', [0.8, 0.2, 0.2]);&lt;br /&gt;
title(['Función Aleatoria (Desviación \sigma_k^2 = 1/k^', num2str(p), ')']);&lt;br /&gt;
xlabel('x');&lt;br /&gt;
ylabel('f_{\sigma}(x)');&lt;br /&gt;
grid on;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=CODIGO 3 =&lt;br /&gt;
&amp;lt;source lang: &amp;quot;Matlab&amp;quot; line&amp;gt;&lt;br /&gt;
% Solución de la Ecuación del Calor con Condiciones Iniciales Aleatorias&lt;br /&gt;
% Caso: Dominio Periódico (Anillo) con Coeficientes de Fourier Estocásticos&lt;br /&gt;
&lt;br /&gt;
clear; clc; close all;&lt;br /&gt;
&lt;br /&gt;
%% 1. Parámetros del Problema&lt;br /&gt;
&lt;br /&gt;
L = 2*pi;              % Longitud del dominio (anillo)&lt;br /&gt;
alpha = 0.5;           % Difusividad térmica&lt;br /&gt;
T_final = 3.0;         % Tiempo total de simulación&lt;br /&gt;
N_x = 500;             % Puntos en el espacio&lt;br /&gt;
x = linspace(0, L, N_x);&lt;br /&gt;
k_max = 50;            % Número de modos de Fourier a sumar&lt;br /&gt;
p = 1;                 % Exponente de decaimiento de varianza (1/k^p)&lt;br /&gt;
&lt;br /&gt;
%% 2. Generación de la Condición Inicial Aleatoria (t = 0)&lt;br /&gt;
% Coeficientes de Fourier aleatorios&lt;br /&gt;
A0 = randn(1); % Media aleatoria&lt;br /&gt;
Ak = randn(1, k_max) ./ ( (1:k_max).^(p/2) ); % Varianza 1/k^p&lt;br /&gt;
Bk = randn(1, k_max) ./ ( (1:k_max).^(p/2) );&lt;br /&gt;
&lt;br /&gt;
% Construcción de la función inicial f(x)&lt;br /&gt;
u_initial = A0/2;&lt;br /&gt;
for k = 1:k_max&lt;br /&gt;
    u_initial = u_initial + Ak(k)*cos(2*pi*k*x/L) + Bk(k)*sin(2*pi*k*x/L);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%% 3. Evolución Temporal y Graficación&lt;br /&gt;
t_steps = [0, 0.05, 0.2, 0.5, 1.5,3]; &lt;br /&gt;
figure('Color', 'w', 'Position', [100, 100, 1000, 600]);&lt;br /&gt;
hold on; grid on;&lt;br /&gt;
&lt;br /&gt;
colors = jet(length(t_steps)); &lt;br /&gt;
&lt;br /&gt;
for i = 1:length(t_steps)&lt;br /&gt;
    t = t_steps(i);&lt;br /&gt;
    &lt;br /&gt;
    % Calculamos la solución u(x,t) usando la serie de Fourier&lt;br /&gt;
    u_t = A0/2;&lt;br /&gt;
    for k = 1:k_max&lt;br /&gt;
        decay = exp(-alpha * (2*pi*k/L)^2 * t); &lt;br /&gt;
        u_t = u_t + decay * (Ak(k)*cos(2*pi*k*x/L) + Bk(k)*sin(2*pi*k*x/L));&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    plot(x, u_t, 'Color', colors(i,:), 'LineWidth', 2, ...&lt;br /&gt;
        'DisplayName', sprintf('t = %.2f', t));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
title(['Evolución de u(x,t) con C.I. Aleatoria (p = ', num2str(p), ')']);&lt;br /&gt;
xlabel('Posición x');&lt;br /&gt;
ylabel('Temperatura u');&lt;br /&gt;
legend show;&lt;br /&gt;
set(gca, 'FontSize', 12);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Categoría:EDP]]&lt;br /&gt;
[[Categoría:EDP25/26]]&lt;/div&gt;</summary>
		<author><name>Carlos Asensio</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/wiki/Series_de_Fourier_ABE</id>
		<title>Series de Fourier ABE</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/wiki/Series_de_Fourier_ABE"/>
				<updated>2026-02-18T20:59:45Z</updated>
		
		<summary type="html">&lt;p&gt;Andrew Fan: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ TrabajoED &lt;br /&gt;
| Series de Fourier. Grupo 6-A | [[:Categoría:EDP|EDP]]|[[:Categoría:EDP25/26|2025-26]] | Andrew Fan&lt;br /&gt;
Bruno Aragón&lt;br /&gt;
&lt;br /&gt;
Ernestine Huge}}&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Poster_ABE.png||900px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
# Plotear base trigonometrica (-pi,pi)&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
N = 4 # n hasta el que representar, el numero de terminos es 2N+1&lt;br /&gt;
&lt;br /&gt;
x = np.linspace(-np.pi, np.pi, 1000)&lt;br /&gt;
&lt;br /&gt;
plt.figure(figsize=(10, 6))&lt;br /&gt;
&lt;br /&gt;
plt.plot(x, np.ones_like(x) / np.sqrt(2 * np.pi), label=r&amp;quot;$\frac{1}{\sqrt{2\pi}}$&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
for n in range(1, N + 1):&lt;br /&gt;
    plt.plot(x, (1 / np.sqrt(np.pi)) * np.cos(n * x), label=rf&amp;quot;$\frac{{1}}{{\sqrt{{\pi}}}}\cos({n}x)$&amp;quot;)&lt;br /&gt;
    plt.plot(x, (1 / np.sqrt(np.pi)) * np.sin(n * x), label=rf&amp;quot;$\frac{{1}}{{\sqrt{{\pi}}}}\sin({n}x)$&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
plt.xlabel(&amp;quot;x&amp;quot;)&lt;br /&gt;
plt.ylabel('Valor')&lt;br /&gt;
plt.title(f&amp;quot;Representacion de los ${2*N+1}$ primeros términos de la base trigonométrica&amp;quot;)&lt;br /&gt;
plt.grid(True)&lt;br /&gt;
plt.legend(bbox_to_anchor=(1.05, 1), loc=&amp;quot;upper left&amp;quot;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
from scipy.integrate import quad&lt;br /&gt;
&lt;br /&gt;
def CoeficienteFourierPI2(f,N):&lt;br /&gt;
    c0 = 1/(2*np.pi)**(1/2) * quad(lambda t: f(t),-np.pi,np.pi)[0]&lt;br /&gt;
    c = np.zeros(N+1)&lt;br /&gt;
    d = np.zeros(N+1)&lt;br /&gt;
    for n in range(1,N+1):&lt;br /&gt;
        c[n] = 1/(np.pi)**(1/2) * quad(lambda t: f(t)*np.cos(n*t),-np.pi,np.pi)[0]&lt;br /&gt;
        d[n] = 1/(np.pi)**(1/2) * quad(lambda t: f(t)*np.sin(n*t),-np.pi,np.pi)[0]&lt;br /&gt;
    &lt;br /&gt;
    return c0,c,d&lt;br /&gt;
&lt;br /&gt;
def SerieFourierPI2(x,c0,c,d):&lt;br /&gt;
    N = len(d)-1&lt;br /&gt;
    S =  1/(2*np.pi)**(1/2)*c0&lt;br /&gt;
    for n in range(1,N+1):&lt;br /&gt;
        S +=  c[n]*1/(np.pi)**(1/2)*np.cos(n*x)+d[n]*1/(np.pi)**(1/2)*np.sin(n*x)&lt;br /&gt;
    return S&lt;br /&gt;
&lt;br /&gt;
#f es la función a aproximar, Nin es el mínimo n a usar, Nmax es el maximo n a usar, Nav es la &lt;br /&gt;
#cantidad que le suma al n mínimo en cada aproximación&lt;br /&gt;
&lt;br /&gt;
def PLOTEARE2(f,Nin,Nav,Nmax,M):&lt;br /&gt;
    n = Nin&lt;br /&gt;
    Lista = []&lt;br /&gt;
    Lind = []&lt;br /&gt;
    while n&amp;lt;Nmax:&lt;br /&gt;
        Lind += [n]&lt;br /&gt;
        c0,c,d=CoeficienteFourierPI2(f,n)&lt;br /&gt;
        Lista += [[c0,c,d]]&lt;br /&gt;
        n+=Nav&lt;br /&gt;
    &lt;br /&gt;
    x = np.linspace(-np.pi,np.pi,M)&lt;br /&gt;
    fx=f(x)&lt;br /&gt;
    plt.figure(figsize=(8,5))&lt;br /&gt;
    plt.plot(x, fx, label=&amp;quot;f(x)&amp;quot;, linewidth=2)&lt;br /&gt;
    for i in range(len(Lista)):&lt;br /&gt;
        plt.plot(x, SerieFourierPI2(x,Lista[i][0],Lista[i][1],Lista[i][2]), label= f&amp;quot;Serie de Fourier $S_{{{Lind[i]}}}(x)$&amp;quot;, linewidth=&amp;quot;1&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
    plt.xlabel(&amp;quot;x&amp;quot;)&lt;br /&gt;
    plt.ylabel(&amp;quot;y&amp;quot;)&lt;br /&gt;
    plt.title(&amp;quot;Aproximación de Fourier en $(-\pi,\pi)$&amp;quot;)&lt;br /&gt;
    plt.legend()&lt;br /&gt;
    plt.grid(True)&lt;br /&gt;
&lt;br /&gt;
    plt.show()&lt;br /&gt;
&lt;br /&gt;
def j(x):&lt;br /&gt;
    return x*np.exp(-x)&lt;br /&gt;
def gesc(x):&lt;br /&gt;
    if x&amp;lt;=0:&lt;br /&gt;
        return 1&lt;br /&gt;
    else:&lt;br /&gt;
        return 0&lt;br /&gt;
g = np.vectorize(gesc)&lt;br /&gt;
&lt;br /&gt;
PLOTEARE2(j,5,10,40,1000)&lt;br /&gt;
PLOTEARE2(g,5,5,25,1000)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
from scipy.integrate import quad&lt;br /&gt;
&lt;br /&gt;
def ERROR(f,N):&lt;br /&gt;
    c0,c,d=CoeficienteFourierPI2(f,N)&lt;br /&gt;
    error = (quad(lambda t: (f(t)-SerieFourierPI2(t,c0,c,d))**(2),-np.pi,np.pi)[0])**(1/2)&lt;br /&gt;
    return error&lt;br /&gt;
def PlotearERROR(f,ninicial,nvar,Nmax):&lt;br /&gt;
    N=Nmax&lt;br /&gt;
    n=ninicial&lt;br /&gt;
    s=nvar&lt;br /&gt;
    Error=[]&lt;br /&gt;
    Ind = []&lt;br /&gt;
    while n&amp;lt;N:&lt;br /&gt;
        Error += [ERROR(f,n)]&lt;br /&gt;
        Ind += [n]&lt;br /&gt;
        n+=s&lt;br /&gt;
        &lt;br /&gt;
    plt.figure(figsize=(8,5))&lt;br /&gt;
    plt.plot(Ind, Error, 'o-', linewidth=2)&lt;br /&gt;
    plt.xlabel(&amp;quot;N&amp;quot;)&lt;br /&gt;
    plt.ylabel(r&amp;quot;$\|f - S_N\|_{L^2}$&amp;quot;)&lt;br /&gt;
    plt.title(&amp;quot;Error en norma $L^2$&amp;quot;)&lt;br /&gt;
    plt.grid(True)&lt;br /&gt;
    plt.show()&lt;br /&gt;
&lt;br /&gt;
def j(x):&lt;br /&gt;
    return x*np.exp(-x)&lt;br /&gt;
def gesc(x):&lt;br /&gt;
    if x&amp;lt;=0:&lt;br /&gt;
        return 1&lt;br /&gt;
    else:&lt;br /&gt;
        return 0&lt;br /&gt;
g = np.vectorize(gesc)&lt;br /&gt;
    &lt;br /&gt;
PlotearERROR(j,5,5,55)&lt;br /&gt;
PlotearERROR(g,2,2,50)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Categoría:EDP]]&lt;br /&gt;
[[Categoría:EDP25/26]]&lt;/div&gt;</summary>
		<author><name>Andrew Fan</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/wiki/Series_de_Fourier_CPP</id>
		<title>Series de Fourier CPP</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/wiki/Series_de_Fourier_CPP"/>
				<updated>2026-02-18T20:26:54Z</updated>
		
		<summary type="html">&lt;p&gt;Paulasanchezjauregui: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
{{ TrabajoED | Series de Fourier. Grupo PCP| [[:Categoría:EDP|EDP]]|[[:Categoría:EDP25/26|2025-26]] | Paula Sánchez,Paula Mellado y Clara Garcia-Hoz}}&lt;br /&gt;
&lt;br /&gt;
[[Archivo:poster.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Referencias ===&lt;br /&gt;
&lt;br /&gt;
Sandro Salsa — Partial Differential Equations in Action&lt;br /&gt;
https://tutorial.math.lamar.edu/Classes/DE/ConvergenceFourierSeries.aspx&lt;br /&gt;
&lt;br /&gt;
https://www.physicsclassroom.com&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Serie de Fourier ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Categoría:EDP]]&lt;br /&gt;
[[Categoría:EDP25/26]]&lt;br /&gt;
&lt;br /&gt;
Abajo se puede ver el código que se ha utilizado para conseguir las gráficas y la serie de Fourier de la función. &lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
from scipy.integrate import trapezoid&lt;br /&gt;
&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
# ============================================================&lt;br /&gt;
# 0) SERIE DE FOURIER (texto que se imprime al ejecutar)&lt;br /&gt;
# ============================================================&lt;br /&gt;
&lt;br /&gt;
def print_fourier_series_info():&lt;br /&gt;
    print(&amp;quot;\n&amp;quot; + &amp;quot;=&amp;quot;*70)&lt;br /&gt;
    print(&amp;quot;ESTUDIO: Fenómeno de Gibbs en la onda cuadrada 2π-periódica&amp;quot;)&lt;br /&gt;
    print(&amp;quot;=&amp;quot;*70)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;\nFunción (onda cuadrada 2π-periódica):&amp;quot;)&lt;br /&gt;
    print(&amp;quot;   f(x) =  1   si  0 &amp;lt; x &amp;lt; π&amp;quot;)&lt;br /&gt;
    print(&amp;quot;   f(x) = -1   si -π &amp;lt; x &amp;lt; 0&amp;quot;)&lt;br /&gt;
    print(&amp;quot;   y se extiende 2π-periódicamente: f(x+2π)=f(x).&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;\nSerie de Fourier:&amp;quot;)&lt;br /&gt;
    print(&amp;quot;   f(x) ~ (4/π) * Σ_{n=1..∞}  sin((2n-1)x)/(2n-1)&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;\nSuma parcial (N términos):&amp;quot;)&lt;br /&gt;
    print(&amp;quot;   S_N(x) = (4/π) * Σ_{n=1..N}  sin((2n-1)x)/(2n-1)&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;\nHechos clave (Gibbs):&amp;quot;)&lt;br /&gt;
    print(&amp;quot; - Cerca de las discontinuidades aparecen oscilaciones.&amp;quot;)&lt;br /&gt;
    print(&amp;quot; - Al aumentar N, las oscilaciones se 'concentran' cerca del salto,&amp;quot;)&lt;br /&gt;
    print(&amp;quot;   pero el sobreimpulso máximo NO desaparece (tiende a una constante).&amp;quot;)&lt;br /&gt;
    print(&amp;quot; - Lejos del salto, S_N converge mejor (convergencia puntual en continuidad).&amp;quot;)&lt;br /&gt;
    print(&amp;quot;=&amp;quot;*70 + &amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# ============================================================&lt;br /&gt;
# 1) Definición de la onda cuadrada 2π-periódica&lt;br /&gt;
# ============================================================&lt;br /&gt;
&lt;br /&gt;
def square_wave_2pi(x):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    Onda cuadrada 2π-periódica con salto en 0 (y ±π).&lt;br /&gt;
    Se define en el intervalo principal (-π, π].&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    xr = (x + np.pi) % (2*np.pi) - np.pi  # reduce a (-π, π]&lt;br /&gt;
    y = np.where(xr &amp;gt; 0, 1.0, -1.0)&lt;br /&gt;
    return y&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# ============================================================&lt;br /&gt;
# 2) Suma parcial de Fourier&lt;br /&gt;
# ============================================================&lt;br /&gt;
&lt;br /&gt;
def fourier_partial_sum_square(x, N):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    S_N(x) = (4/π) * sum_{n=1..N} sin((2n-1)x)/(2n-1)&lt;br /&gt;
    Vectorizado para x array.&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    k = 2*np.arange(1, N+1) - 1  # 1,3,5,...,(2N-1)&lt;br /&gt;
    return (4/np.pi) * np.sum(np.sin(np.outer(k, x)) / k[:, None], axis=0)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# ============================================================&lt;br /&gt;
# 3) DIBUJOS: global + zoom Gibbs&lt;br /&gt;
# ============================================================&lt;br /&gt;
&lt;br /&gt;
def plot_global_and_zoom():&lt;br /&gt;
    # Global&lt;br /&gt;
    M = 5000&lt;br /&gt;
    x = np.linspace(-np.pi, np.pi, M, endpoint=True)&lt;br /&gt;
    f = square_wave_2pi(x)&lt;br /&gt;
&lt;br /&gt;
    plt.figure()&lt;br /&gt;
    plt.plot(x, f, linewidth=2, label=&amp;quot;f(x) (onda cuadrada)&amp;quot;)&lt;br /&gt;
    for N in [1, 3, 10, 50, 100]:&lt;br /&gt;
        S = fourier_partial_sum_square(x, N)&lt;br /&gt;
        plt.plot(x, S, label=f&amp;quot;S_{N}(x)&amp;quot;)&lt;br /&gt;
    plt.title(&amp;quot;Aproximación global de la onda cuadrada con sumas parciales&amp;quot;)&lt;br /&gt;
    plt.xlabel(&amp;quot;x&amp;quot;)&lt;br /&gt;
    plt.ylabel(&amp;quot;amplitud&amp;quot;)&lt;br /&gt;
    plt.ylim(-1.6, 1.6)&lt;br /&gt;
    plt.grid(True, alpha=0.3)&lt;br /&gt;
    plt.legend()&lt;br /&gt;
    plt.show()&lt;br /&gt;
&lt;br /&gt;
    # Zoom cerca de x=0&lt;br /&gt;
    zoom = 0.5&lt;br /&gt;
    xz = np.linspace(-zoom, zoom, 3000)&lt;br /&gt;
    fz = square_wave_2pi(xz)&lt;br /&gt;
&lt;br /&gt;
    plt.figure()&lt;br /&gt;
    plt.plot(xz, fz, linewidth=2, label=&amp;quot;f(x)&amp;quot;)&lt;br /&gt;
    for N in [5, 10, 20, 50, 100]:&lt;br /&gt;
        Sz = fourier_partial_sum_square(xz, N)&lt;br /&gt;
        plt.plot(xz, Sz, label=f&amp;quot;S_{N}(x)&amp;quot;)&lt;br /&gt;
    plt.title(&amp;quot;Fenómeno de Gibbs (zoom cerca de la discontinuidad x=0)&amp;quot;)&lt;br /&gt;
    plt.xlabel(&amp;quot;x&amp;quot;)&lt;br /&gt;
    plt.ylabel(&amp;quot;amplitud&amp;quot;)&lt;br /&gt;
    plt.ylim(-1.6, 1.6)&lt;br /&gt;
    plt.grid(True, alpha=0.3)&lt;br /&gt;
    plt.legend()&lt;br /&gt;
    plt.show()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# ============================================================&lt;br /&gt;
# 4) ANÁLISIS NUMÉRICO del Gibbs: overshoot/undershoot vs N&lt;br /&gt;
# ============================================================&lt;br /&gt;
&lt;br /&gt;
def gibbs_numerical_study(Nmax=300, window=0.3):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    Mide numéricamente:&lt;br /&gt;
      - overshoot a la derecha del salto: max(S_N) - 1&lt;br /&gt;
      - undershoot a la izquierda: (-1) - min(S_N) con signo ajustado&lt;br /&gt;
    Normaliza por el salto (que vale 2).&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    jump = 2.0  # salto de -1 a +1&lt;br /&gt;
&lt;br /&gt;
    x_right = np.linspace(0, window, 6000, endpoint=True)&lt;br /&gt;
    x_left  = np.linspace(-window, 0, 6000, endpoint=True)&lt;br /&gt;
&lt;br /&gt;
    overshoot_vals = np.zeros(Nmax)&lt;br /&gt;
    undershoot_vals = np.zeros(Nmax)&lt;br /&gt;
&lt;br /&gt;
    for N in range(1, Nmax+1):&lt;br /&gt;
        Sr = fourier_partial_sum_square(x_right, N)&lt;br /&gt;
        Sl = fourier_partial_sum_square(x_left, N)&lt;br /&gt;
&lt;br /&gt;
        overshoot_vals[N-1] = np.max(Sr) - 1.0&lt;br /&gt;
        undershoot_vals[N-1] = -1.0 - np.min(Sl)&lt;br /&gt;
&lt;br /&gt;
    overshoot_rel = overshoot_vals / jump&lt;br /&gt;
    undershoot_rel = undershoot_vals / jump&lt;br /&gt;
&lt;br /&gt;
    # Gráfica overshoot/undershoot&lt;br /&gt;
    N_axis = np.arange(1, Nmax+1)&lt;br /&gt;
    plt.figure()&lt;br /&gt;
    plt.plot(N_axis, overshoot_rel, label=&amp;quot;Sobreoscilación / salto&amp;quot;)&lt;br /&gt;
    plt.plot(N_axis, undershoot_rel, label=&amp;quot;Suboscilación / salto&amp;quot;)&lt;br /&gt;
    plt.title(&amp;quot;Medida numérica del Gibbs (normalizado por el salto)&amp;quot;)&lt;br /&gt;
    plt.xlabel(&amp;quot;N (número de términos)&amp;quot;)&lt;br /&gt;
    plt.ylabel(&amp;quot;amplitud relativa&amp;quot;)&lt;br /&gt;
    plt.grid(True, alpha=0.3)&lt;br /&gt;
    plt.legend()&lt;br /&gt;
    plt.show()&lt;br /&gt;
&lt;br /&gt;
    # Resumen en consola&lt;br /&gt;
    print(&amp;quot;\n&amp;quot; + &amp;quot;-&amp;quot;*70)&lt;br /&gt;
    print(f&amp;quot;Resumen numérico local (buscado en ventana ±{window} alrededor del salto x=0)&amp;quot;)&lt;br /&gt;
    print(&amp;quot;El salto es 2 (de -1 a +1). Se muestra el sobreimpulso relativo over/jump.&amp;quot;)&lt;br /&gt;
    print(&amp;quot;-&amp;quot;*70)&lt;br /&gt;
&lt;br /&gt;
    Ns_show = [5, 10, 20, 50, 100, 200, Nmax]&lt;br /&gt;
    print(&amp;quot;N\tmax(S_N) der.\tmin(S_N) izq.\tOvershoot\tUndershoot\tOver/jump&amp;quot;)&lt;br /&gt;
    for N in Ns_show:&lt;br /&gt;
        Sr = fourier_partial_sum_square(x_right, N)&lt;br /&gt;
        Sl = fourier_partial_sum_square(x_left, N)&lt;br /&gt;
        max_right = np.max(Sr)&lt;br /&gt;
        min_left  = np.min(Sl)&lt;br /&gt;
        over = max_right - 1.0&lt;br /&gt;
        under = -1.0 - min_left&lt;br /&gt;
        print(f&amp;quot;{N}\t{max_right:+.6f}\t\t{min_left:+.6f}\t\t{over:.6f}\t\t{under:.6f}\t\t{over/jump:.6f}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    # Reporte final (valores límite aproximados numéricamente)&lt;br /&gt;
    print(&amp;quot;\nObservación:&amp;quot;)&lt;br /&gt;
    print(&amp;quot; - Al crecer N, el sobreimpulso relativo (over/jump) se estabiliza cerca de un valor constante.&amp;quot;)&lt;br /&gt;
    print(&amp;quot; - Aunque el ancho de la zona oscilatoria se hace más pequeño, la altura máxima no tiende a 0.&amp;quot;)&lt;br /&gt;
    print(&amp;quot;-&amp;quot;*70 + &amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# ============================================================&lt;br /&gt;
# 5) CONVERGENCIA LEJOS DE LA DISCONTINUIDAD&lt;br /&gt;
# ============================================================&lt;br /&gt;
&lt;br /&gt;
def convergence_away_from_jumps(Nmax=300, exclude=0.15):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    Mide el error supremo ||S_N - f||_∞ evitando:&lt;br /&gt;
      - vecindad de x=0&lt;br /&gt;
      - vecindad de x=±π&lt;br /&gt;
    para mostrar que en zonas continuas el error baja con N.&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    M = 6000&lt;br /&gt;
    x = np.linspace(-np.pi, np.pi, M, endpoint=True)&lt;br /&gt;
    f = square_wave_2pi(x)&lt;br /&gt;
&lt;br /&gt;
    mask = (np.abs(x) &amp;gt; exclude) &amp;amp; (np.abs(np.abs(x) - np.pi) &amp;gt; exclude)&lt;br /&gt;
&lt;br /&gt;
    errors_sup = np.zeros(Nmax)&lt;br /&gt;
    for N in range(1, Nmax+1):&lt;br /&gt;
        S = fourier_partial_sum_square(x, N)&lt;br /&gt;
        errors_sup[N-1] = np.max(np.abs(S[mask] - f[mask]))&lt;br /&gt;
&lt;br /&gt;
    N_axis = np.arange(1, Nmax+1)&lt;br /&gt;
    plt.figure()&lt;br /&gt;
    plt.plot(N_axis, errors_sup)&lt;br /&gt;
    plt.title(&amp;quot;Error supremo lejos de discontinuidades (zona continua)&amp;quot;)&lt;br /&gt;
    plt.xlabel(&amp;quot;N (número de términos)&amp;quot;)&lt;br /&gt;
    plt.ylabel(r&amp;quot;$\|S_N - f\|_\infty$ (fuera de saltos)&amp;quot;)&lt;br /&gt;
    plt.grid(True, alpha=0.3)&lt;br /&gt;
    plt.show()&lt;br /&gt;
&lt;br /&gt;
    # Print breve&lt;br /&gt;
    print(&amp;quot;Error supremo lejos de saltos:&amp;quot;)&lt;br /&gt;
    print(f&amp;quot; - N=10:  {errors_sup[9]:.6f}&amp;quot;)&lt;br /&gt;
    print(f&amp;quot; - N=50:  {errors_sup[49]:.6f}&amp;quot;)&lt;br /&gt;
    print(f&amp;quot; - N=100: {errors_sup[99]:.6f}&amp;quot;)&lt;br /&gt;
    print(f&amp;quot; - N={Nmax}: {errors_sup[Nmax-1]:.6f}&amp;quot;)&lt;br /&gt;
    print()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# ============================================================&lt;br /&gt;
# MAIN: que salga TODO al ejecutar&lt;br /&gt;
# ============================================================&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    print_fourier_series_info()&lt;br /&gt;
    plot_global_and_zoom()&lt;br /&gt;
    gibbs_numerical_study(Nmax=300, window=0.3)&lt;br /&gt;
    convergence_away_from_jumps(Nmax=300, exclude=0.15)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''&lt;br /&gt;
&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
#&lt;br /&gt;
# Parámetros (fijamos f0=440)&lt;br /&gt;
#&lt;br /&gt;
f0 = 440.0                      # Hz&lt;br /&gt;
omega0 = 2*np.pi*f0             # rad/s&lt;br /&gt;
T = 1.0/f0                      # periodo&lt;br /&gt;
&lt;br /&gt;
# Mallado temporal, cambiamos periodos&lt;br /&gt;
n_periods = 3&lt;br /&gt;
t = np.linspace(0, n_periods*T, 6000)&lt;br /&gt;
&lt;br /&gt;
# Coeficientes a_k de la señal (solo senos)&lt;br /&gt;
a = {1: 1.0, 2: 0.6, 3: 0.3, 4: 0.1}&lt;br /&gt;
&lt;br /&gt;
def F(t):&lt;br /&gt;
    return sum(a[k]*np.sin(k*omega0*t) for k in a)&lt;br /&gt;
&lt;br /&gt;
def S_N(t, N):&lt;br /&gt;
    return sum(a[k]*np.sin(k*omega0*t) for k in a if k &amp;lt;= N)&lt;br /&gt;
&lt;br /&gt;
#&lt;br /&gt;
# 1) Gráfica: señal original y sumas parciales&lt;br /&gt;
# &lt;br /&gt;
plt.figure()&lt;br /&gt;
plt.plot(t, F(t), label=&amp;quot;F(t)&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
for N in [1, 2, 3, 4]:&lt;br /&gt;
    plt.plot(t, S_N(t, N), label=f&amp;quot;S_{N}(t)&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
plt.xlabel(&amp;quot;t (s)&amp;quot;)&lt;br /&gt;
plt.ylabel(&amp;quot;amplitud&amp;quot;)&lt;br /&gt;
plt.title(&amp;quot;F(t) y sumas parciales S_N(t)&amp;quot;)&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
# &lt;br /&gt;
# 2) Gráfica: 3er armónico aislado&lt;br /&gt;
#&lt;br /&gt;
plt.figure()&lt;br /&gt;
plt.plot(t, 0.3*np.sin(3*omega0*t), label=&amp;quot;F_3(t) = 0.3 sin(3 ω0 t)&amp;quot;)&lt;br /&gt;
plt.plot(t, F(t), label=&amp;quot;F(t)&amp;quot;, alpha=0.7)&lt;br /&gt;
plt.xlabel(&amp;quot;t (s)&amp;quot;)&lt;br /&gt;
plt.ylabel(&amp;quot;amplitud&amp;quot;)&lt;br /&gt;
plt.title(&amp;quot;3er armónico y comparación con la señal completa&amp;quot;)&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#&lt;br /&gt;
# 3) Estudio numérico del error vs N&lt;br /&gt;
#   - Error L2 (aprox. por trapecios)&lt;br /&gt;
#   - Error sup (norma infinita en la malla)&lt;br /&gt;
# &lt;br /&gt;
def L2_error(N):&lt;br /&gt;
    e = F(t) - S_N(t, N)&lt;br /&gt;
    # Integral sobre el intervalo visualizado [0, n_periods*T]&lt;br /&gt;
    return np.sqrt(np.trapz(e**2, t))&lt;br /&gt;
&lt;br /&gt;
def sup_error(N):&lt;br /&gt;
    e = F(t) - S_N(t, N)&lt;br /&gt;
    return np.max(np.abs(e))&lt;br /&gt;
&lt;br /&gt;
Ns = np.arange(1, 9)&lt;br /&gt;
err_L2 = np.array([L2_error(N) for N in Ns])&lt;br /&gt;
err_sup = np.array([sup_error(N) for N in Ns])&lt;br /&gt;
&lt;br /&gt;
plt.figure()&lt;br /&gt;
plt.plot(Ns, err_L2, marker=&amp;quot;o&amp;quot;, label=&amp;quot;Error L2 (numérico)&amp;quot;)&lt;br /&gt;
plt.plot(Ns, err_sup, marker=&amp;quot;o&amp;quot;, label=&amp;quot;Error sup (malla)&amp;quot;)&lt;br /&gt;
plt.xlabel(&amp;quot;N (número de términos)&amp;quot;)&lt;br /&gt;
plt.ylabel(&amp;quot;error&amp;quot;)&lt;br /&gt;
plt.title(&amp;quot;Convergencia numérica: error vs N&amp;quot;)&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True)&lt;br /&gt;
plt.show()&lt;br /&gt;
'''&lt;br /&gt;
&lt;br /&gt;
'''&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
# Dominio&lt;br /&gt;
x = np.linspace(-np.pi, np.pi, 4000)&lt;br /&gt;
&lt;br /&gt;
# Onda cuadrada 2π-periódica: -1 en (-π,0), +1 en (0,π)&lt;br /&gt;
f = np.where(x &amp;lt; 0, -1.0, 1.0)&lt;br /&gt;
f[np.isclose(x, 0.0)] = 0.0  # en el salto el valor da igual para el dibujo&lt;br /&gt;
&lt;br /&gt;
def fourier_square_partial_sum(x, N):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    Suma parcial S_N de la serie de Fourier de la onda cuadrada:&lt;br /&gt;
    f(x) ~ (4/π) * sum_{k=1..∞} sin((2k-1)x)/(2k-1)&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    k = np.arange(1, N + 1)&lt;br /&gt;
    odd = 2 * k - 1                       # 1,3,5,7,...&lt;br /&gt;
    terms = np.sin(np.outer(odd, x)) / odd[:, None]&lt;br /&gt;
    return (4/np.pi) * terms.sum(axis=0)&lt;br /&gt;
&lt;br /&gt;
N_list = [3, 10, 50]&lt;br /&gt;
plt.figure(figsize=(10, 4.8))&lt;br /&gt;
plt.plot(x, f, linewidth=2, label=&amp;quot;Onda cuadrada f(x)&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
for N in N_list:&lt;br /&gt;
    plt.plot(x, fourier_square_partial_sum(x, N), linewidth=1.5, label=f&amp;quot;Suma parcial N={N}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
plt.xlim(-np.pi, np.pi)&lt;br /&gt;
plt.ylim(-1.6, 1.6)&lt;br /&gt;
plt.xlabel(&amp;quot;x&amp;quot;)&lt;br /&gt;
plt.ylabel(&amp;quot;amplitud&amp;quot;)&lt;br /&gt;
plt.title(&amp;quot;Fenómeno de Gibbs: aproximación de una onda cuadrada con series de Fourier&amp;quot;)&lt;br /&gt;
plt.grid(True, alpha=0.25)&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.tight_layout()&lt;br /&gt;
plt.show()&lt;br /&gt;
'''&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Categoría:EDP]]&lt;br /&gt;
[[Categoría:EDP25/26]]&lt;/div&gt;</summary>
		<author><name>Paulasanchezjauregui</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/wiki/Series_de_Fourier_MMA</id>
		<title>Series de Fourier MMA</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/wiki/Series_de_Fourier_MMA"/>
				<updated>2026-02-18T19:33:55Z</updated>
		
		<summary type="html">&lt;p&gt;Marta Tejedor: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ TrabajoED | Series de Fourier. Grupo MMA| [[:Categoría:EDP|EDP]]|[[:Categoría:EDP25/26|2025-26]] | Marta Tejedor &lt;br /&gt;
&lt;br /&gt;
María Romojaro&lt;br /&gt;
&lt;br /&gt;
Andrea Sánchez}}&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Series de Fourier MMA.jpeg||800px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Serie de Fourier Función Exponencial ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{matlab|codigo=&lt;br /&gt;
&lt;br /&gt;
clear; clc; close all;&lt;br /&gt;
&lt;br /&gt;
% Dominio&lt;br /&gt;
x = linspace(-pi, pi, 2000);&lt;br /&gt;
&lt;br /&gt;
% Función original&lt;br /&gt;
f = exp(x);&lt;br /&gt;
&lt;br /&gt;
% Número máximo de modos&lt;br /&gt;
Nmax = 100;&lt;br /&gt;
&lt;br /&gt;
% ---- Coeficientes trigonométricos ----&lt;br /&gt;
a0 = (1/pi) * trapz(x, f);&lt;br /&gt;
&lt;br /&gt;
an = zeros(1, Nmax);&lt;br /&gt;
bn = zeros(1, Nmax);&lt;br /&gt;
&lt;br /&gt;
for n = 1:Nmax&lt;br /&gt;
    an(n) = (1/pi) * trapz(x, f .* cos(n*x));&lt;br /&gt;
    bn(n) = (1/pi) * trapz(x, f .* sin(n*x));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% Valores de N que queremos visualizar&lt;br /&gt;
N_values = [5 10 15 50];&lt;br /&gt;
&lt;br /&gt;
figure; hold on;&lt;br /&gt;
&lt;br /&gt;
% Dibujar función original&lt;br /&gt;
plot(x, f, 'k', 'LineWidth', 1);&lt;br /&gt;
&lt;br /&gt;
% Colores automáticos&lt;br /&gt;
colors = lines(length(N_values));&lt;br /&gt;
&lt;br /&gt;
for j = 1:length(N_values)&lt;br /&gt;
    N = N_values(j);&lt;br /&gt;
&lt;br /&gt;
    % Suma parcial trigonométrica&lt;br /&gt;
    SN = (a0/2) * ones(size(x));&lt;br /&gt;
    for n = 1:N&lt;br /&gt;
        SN = SN + an(n)*cos(n*x) + bn(n)*sin(n*x);&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    plot(x, SN, 'Color', colors(j,:), 'LineWidth', 0.8);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
legend('e^x', 'S_5', 'S_{10}', 'S_{15}', 'S_{50}', 'Location', 'best');&lt;br /&gt;
title('Serie de Fourier de e^x');&lt;br /&gt;
xlabel('x');&lt;br /&gt;
ylabel('Valor');&lt;br /&gt;
grid on;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{matlab|codigo=&lt;br /&gt;
&lt;br /&gt;
clear; clc; close all;&lt;br /&gt;
&lt;br /&gt;
% Intervalo&lt;br /&gt;
a = -pi;&lt;br /&gt;
b = pi;&lt;br /&gt;
&lt;br /&gt;
% Mallado fino para integración&lt;br /&gt;
x = linspace(a,b,5000);&lt;br /&gt;
dx = x(2)-x(1);&lt;br /&gt;
&lt;br /&gt;
% Función&lt;br /&gt;
f = sign(t);&lt;br /&gt;
&lt;br /&gt;
% Número máximo de términos&lt;br /&gt;
Nmax = 100;&lt;br /&gt;
&lt;br /&gt;
error_L2 = zeros(1,Nmax);&lt;br /&gt;
&lt;br /&gt;
for N = 1:Nmax&lt;br /&gt;
    &lt;br /&gt;
    % Coeficientes&lt;br /&gt;
    a0 = (1/pi)*trapz(x,f);&lt;br /&gt;
    &lt;br /&gt;
    an = zeros(1,N);&lt;br /&gt;
    bn = zeros(1,N);&lt;br /&gt;
    &lt;br /&gt;
    for n = 1:N&lt;br /&gt;
        an(n) = (1/pi)*trapz(x, f.*cos(n*x));&lt;br /&gt;
        bn(n) = (1/pi)*trapz(x, f.*sin(n*x));&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    % Suma parcial&lt;br /&gt;
    SN = a0/2*ones(size(x));&lt;br /&gt;
    &lt;br /&gt;
    for n = 1:N&lt;br /&gt;
        SN = SN + an(n)*cos(n*x) + bn(n)*sin(n*x);&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    % Error L2&lt;br /&gt;
    error_L2(N) = sqrt(trapz(x, (f-SN).^2));&lt;br /&gt;
    &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% Gráfica del error&lt;br /&gt;
figure;&lt;br /&gt;
plot(1:Nmax, error_L2,'LineWidth',2)&lt;br /&gt;
ylim([0 max(error_L2)])&lt;br /&gt;
xlabel('N'); ylabel('Error L^2');&lt;br /&gt;
title('Error L^2 (e^x)'); grid on&lt;br /&gt;
&lt;br /&gt;
fprintf('Error L2 en N=40: %.16e\n', error_L2(100));&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Serie de Fourier Función Signo ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{matlab|codigo=&lt;br /&gt;
&lt;br /&gt;
clear; clc; close all;&lt;br /&gt;
&lt;br /&gt;
% Dominio&lt;br /&gt;
x = linspace(-pi, pi, 4000);&lt;br /&gt;
&lt;br /&gt;
% Función discontinua: signo (escalón)&lt;br /&gt;
f = ones(size(x));&lt;br /&gt;
f(x &amp;lt; 0) = -1;&lt;br /&gt;
&lt;br /&gt;
% Fourier: máximo modo que necesitamos&lt;br /&gt;
Nmax = 100;&lt;br /&gt;
nvals = -Nmax:Nmax;&lt;br /&gt;
c = zeros(size(nvals));&lt;br /&gt;
&lt;br /&gt;
% Coeficientes c_n = (1/2pi) int f(x) e^{-inx} dx&lt;br /&gt;
for k = 1:length(nvals)&lt;br /&gt;
    n = nvals(k);&lt;br /&gt;
    integrando = f .* exp(-1i*n*x);&lt;br /&gt;
    c(k) = trapz(x, integrando) / (2*pi);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% N a visualizar&lt;br /&gt;
N_values = [5 10 15 50 100];&lt;br /&gt;
&lt;br /&gt;
figure; hold on;&lt;br /&gt;
&lt;br /&gt;
% Original&lt;br /&gt;
plot(x, f, 'k', 'LineWidth', 1);&lt;br /&gt;
&lt;br /&gt;
% Colores automáticos&lt;br /&gt;
colors = lines(length(N_values));&lt;br /&gt;
&lt;br /&gt;
for j = 1:length(N_values)&lt;br /&gt;
    N = N_values(j);&lt;br /&gt;
    SN = zeros(size(x));&lt;br /&gt;
    &lt;br /&gt;
    for k = 1:length(nvals)&lt;br /&gt;
        if abs(nvals(k)) &amp;lt;= N&lt;br /&gt;
            SN = SN + c(k)*exp(1i*nvals(k)*x);&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    plot(x, real(SN), 'Color', colors(j,:), 'LineWidth', 0.8);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
legend('sign(x)', 'S_5', 'S_{10}', 'S_{15}', 'S_{50}','S_{100}', 'Location', 'best');&lt;br /&gt;
title('Serie de Fourier de sign(x)');&lt;br /&gt;
xlabel('x'); ylabel('Valor');&lt;br /&gt;
grid on;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{matlab|codigo=&lt;br /&gt;
&lt;br /&gt;
clear; clc; close all;&lt;br /&gt;
&lt;br /&gt;
% Intervalo&lt;br /&gt;
a = -pi;&lt;br /&gt;
b = pi;&lt;br /&gt;
&lt;br /&gt;
% Mallado fino para integración&lt;br /&gt;
x = linspace(a,b,5000);&lt;br /&gt;
dx = x(2)-x(1);&lt;br /&gt;
&lt;br /&gt;
% Función signo&lt;br /&gt;
f = sign(x);&lt;br /&gt;
&lt;br /&gt;
% Número máximo de términos&lt;br /&gt;
Nmax = 100;&lt;br /&gt;
&lt;br /&gt;
error_L2 = zeros(1,Nmax);&lt;br /&gt;
&lt;br /&gt;
for N = 1:Nmax&lt;br /&gt;
    &lt;br /&gt;
    % Coeficiente a0&lt;br /&gt;
    a0 = (1/pi)*trapz(x,f);&lt;br /&gt;
    &lt;br /&gt;
    an = zeros(1,N);&lt;br /&gt;
    bn = zeros(1,N);&lt;br /&gt;
    &lt;br /&gt;
    for n = 1:N&lt;br /&gt;
        an(n) = (1/pi)*trapz(x, f.*cos(n*x));&lt;br /&gt;
        bn(n) = (1/pi)*trapz(x, f.*sin(n*x));&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    % Suma parcial&lt;br /&gt;
    SN = a0/2*ones(size(x));&lt;br /&gt;
    &lt;br /&gt;
    for n = 1:N&lt;br /&gt;
        SN = SN + an(n)*cos(n*x) + bn(n)*sin(n*x);&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    % Error L2&lt;br /&gt;
    error_L2(N) = sqrt(trapz(x, (f-SN).^2));&lt;br /&gt;
    &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% Gráfica del error&lt;br /&gt;
figure;&lt;br /&gt;
plot(1:Nmax, error_L2,'LineWidth',2)&lt;br /&gt;
xlabel('N'); ylabel('Error L^2');&lt;br /&gt;
title('Error L^2');&lt;br /&gt;
grid on&lt;br /&gt;
&lt;br /&gt;
fprintf('Error L2 en N=100: %.16e\n', error_L2(100));&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{matlab|codigo=&lt;br /&gt;
&lt;br /&gt;
clear; clc; close all;&lt;br /&gt;
&lt;br /&gt;
x = linspace(-pi, pi, 5000);&lt;br /&gt;
&lt;br /&gt;
% Onda cuadrada&lt;br /&gt;
f = ones(size(x));&lt;br /&gt;
f(x &amp;lt; 0) = -1;&lt;br /&gt;
&lt;br /&gt;
Nmax = 100;   % más grande para que Gibbs sea muy claro&lt;br /&gt;
nvals = -Nmax:Nmax;&lt;br /&gt;
c = zeros(size(nvals));&lt;br /&gt;
&lt;br /&gt;
% Coeficientes de Fourier&lt;br /&gt;
for k = 1:length(nvals)&lt;br /&gt;
    n = nvals(k);&lt;br /&gt;
    integrando = f .* exp(-1i*n*x);&lt;br /&gt;
    c(k) = trapz(x, integrando)/(2*pi);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
N_values = [5 10 15 50 100];&lt;br /&gt;
&lt;br /&gt;
figure; hold on;&lt;br /&gt;
&lt;br /&gt;
plot(x, f, 'k', 'LineWidth', 2);&lt;br /&gt;
&lt;br /&gt;
colors = lines(length(N_values));&lt;br /&gt;
&lt;br /&gt;
for j = 1:length(N_values)&lt;br /&gt;
    N = N_values(j);&lt;br /&gt;
    SN = zeros(size(x));&lt;br /&gt;
    &lt;br /&gt;
    for k = 1:length(nvals)&lt;br /&gt;
        if abs(nvals(k)) &amp;lt;= N&lt;br /&gt;
            SN = SN + c(k)*exp(1i*nvals(k)*x);&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    plot(x, real(SN), 'Color', colors(j,:), 'LineWidth', 1.5);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
legend('sign(x)', 'S_5', 'S_{10}', 'S_{15}', 'S_{50}', 'S_{100}', 'Location', 'best');&lt;br /&gt;
title('Fenómeno de Gibbs');&lt;br /&gt;
xlabel('x'); ylabel('Valor');&lt;br /&gt;
grid on;&lt;br /&gt;
&lt;br /&gt;
xlim([-1 1])&lt;br /&gt;
ylim([-1.5 1.5])&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Sumas de Cesàro y de Abel ===&lt;br /&gt;
&lt;br /&gt;
{{matlab|codigo=&lt;br /&gt;
&lt;br /&gt;
clear; clc; close all;&lt;br /&gt;
&lt;br /&gt;
% Intervalo base [-pi, pi]&lt;br /&gt;
a = -pi; b = pi;&lt;br /&gt;
x = linspace(a,b,2000);&lt;br /&gt;
&lt;br /&gt;
% Parámetros de la animación&lt;br /&gt;
N_list = 1:2:80;            % N creciente&lt;br /&gt;
r_list = linspace(0.60,0.98, length(N_list));  % r creciente (mismo nº de frames)&lt;br /&gt;
&lt;br /&gt;
% Funciones a animar&lt;br /&gt;
cases = {&lt;br /&gt;
    @(t) sign(t), 'sign';&lt;br /&gt;
    @(t) exp(t),  'exp'&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
for c = 1:size(cases,1)&lt;br /&gt;
    f = cases{c,1};&lt;br /&gt;
    name = cases{c,2};&lt;br /&gt;
&lt;br /&gt;
    outdir = fullfile(pwd, ['frames_' name]);&lt;br /&gt;
    if ~exist(outdir, 'dir'); mkdir(outdir); end&lt;br /&gt;
&lt;br /&gt;
    % Precomputo coeficientes hasta Nmax para eficiencia&lt;br /&gt;
    Nmax = max(N_list);&lt;br /&gt;
    [a0, an, bn] = fourier_coef(f, a, b, Nmax);&lt;br /&gt;
&lt;br /&gt;
    for k = 1:length(N_list)&lt;br /&gt;
        N = N_list(k);&lt;br /&gt;
        r = r_list(k);&lt;br /&gt;
&lt;br /&gt;
        % Aproximaciones&lt;br /&gt;
        SN    = fourier_partial(a0, an, bn, x, N);&lt;br /&gt;
        CesN  = fourier_cesaro(a0, an, bn, x, N); % Fejér&lt;br /&gt;
        AbelN = fourier_abel(a0, an, bn, x, N, r);&lt;br /&gt;
&lt;br /&gt;
        % Plot&lt;br /&gt;
        figure(1); clf;&lt;br /&gt;
        plot(x, f(x), 'LineWidth', 2); hold on;&lt;br /&gt;
        plot(x, SN,    'LineWidth', 1.2);&lt;br /&gt;
        plot(x, CesN,  'LineWidth', 1.2);&lt;br /&gt;
        plot(x, AbelN, 'LineWidth', 1.2);&lt;br /&gt;
        grid on;&lt;br /&gt;
&lt;br /&gt;
        xlabel('x'); ylabel('y');&lt;br /&gt;
        title(sprintf('%s: N=%d, r=%.2f', name, N, r));&lt;br /&gt;
        legend('f(x)', 'S_N', 'Cesàro (Fejér)', 'Abel', 'Location','best');&lt;br /&gt;
&lt;br /&gt;
        % Guardar frame&lt;br /&gt;
        fname = fullfile(outdir, sprintf('frame_%04d.png', k));&lt;br /&gt;
        exportgraphics(gcf, fname, 'Resolution', 200);&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
disp('Frames generados.');&lt;br /&gt;
&lt;br /&gt;
%% ================== FUNCIONES ==================&lt;br /&gt;
&lt;br /&gt;
function [a0, an, bn] = fourier_coef(f, a, b, N)&lt;br /&gt;
% Coeficientes trigonométricos en [a,b], periodo T=b-a&lt;br /&gt;
    T = b - a;&lt;br /&gt;
    xx = linspace(a,b,12000);    % mallado fino para integrar&lt;br /&gt;
    fx = f(xx);&lt;br /&gt;
&lt;br /&gt;
    a0 = (2/T) * trapz(xx, fx);&lt;br /&gt;
&lt;br /&gt;
    an = zeros(1,N);&lt;br /&gt;
    bn = zeros(1,N);&lt;br /&gt;
&lt;br /&gt;
    for n = 1:N&lt;br /&gt;
        an(n) = (2/T) * trapz(xx, fx .* cos(2*pi*n*xx/T));&lt;br /&gt;
        bn(n) = (2/T) * trapz(xx, fx .* sin(2*pi*n*xx/T));&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function SN = fourier_partial(a0, an, bn, x, N)&lt;br /&gt;
% S_N(x) usando primeros N coeficientes en [-pi,pi] =&amp;gt; cos(nx), sin(nx)&lt;br /&gt;
    SN = (a0/2) * ones(size(x));&lt;br /&gt;
    for n = 1:N&lt;br /&gt;
        SN = SN + an(n)*cos(n*x) + bn(n)*sin(n*x);&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function sigmaN = fourier_cesaro(a0, an, bn, x, N)&lt;br /&gt;
% Cesàro/Fejér: sigma_N = (1/(N+1)) sum_{k=0}^N S_k&lt;br /&gt;
    sigmaN = zeros(size(x));&lt;br /&gt;
    Sk = (a0/2) * ones(size(x));  % S_0&lt;br /&gt;
    sigmaN = sigmaN + Sk;&lt;br /&gt;
&lt;br /&gt;
    for k = 1:N&lt;br /&gt;
        Sk = Sk + an(k)*cos(k*x) + bn(k)*sin(k*x);&lt;br /&gt;
        sigmaN = sigmaN + Sk;&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    sigmaN = sigmaN/(N+1);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Ar = fourier_abel(a0, an, bn, x, N, r)&lt;br /&gt;
% Abel truncado: A_r(x) = a0/2 + sum_{n=1}^N r^n(...)&lt;br /&gt;
    Ar = (a0/2) * ones(size(x));&lt;br /&gt;
    for n = 1:N&lt;br /&gt;
        Ar = Ar + (r^n) * ( an(n)*cos(n*x) + bn(n)*sin(n*x) );&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Apéndice ===&lt;br /&gt;
&lt;br /&gt;
[[Archivo:SumasFourierMMA.gif||]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Categoría:EDP]]&lt;br /&gt;
[[Categoría:EDP25/26]]&lt;/div&gt;</summary>
		<author><name>Maria.romojaro</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/wiki/Series_de_Fourier_RAJ</id>
		<title>Series de Fourier RAJ</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/wiki/Series_de_Fourier_RAJ"/>
				<updated>2026-02-18T18:53:39Z</updated>
		
		<summary type="html">&lt;p&gt;Alejandro.mates: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ TrabajoED | Series de Fourier. Grupo RAJ| [[:Categoría:EDP|EDP]]|[[:Categoría:EDP25/26|2025-26]] | Rodrigo Gallardo García&lt;br /&gt;
&lt;br /&gt;
Alejandro Cogollor Torres&lt;br /&gt;
&lt;br /&gt;
Javier Martín Pérez }}&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Series de fourier RAJ.jpeg||800px]]&lt;br /&gt;
[[Archivo:Poster_Gibbs_RAJ.pdf]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Se adjunta a continuación el código utilizado para la visualización de las gráficas expuestas durante la presentación.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
import scipy.integrate&lt;br /&gt;
&lt;br /&gt;
def construir_coeficientes_par(funcion, n_terminos, dx=1e-3):&lt;br /&gt;
&lt;br /&gt;
    x = np.arange(0, 1 + dx/2, dx)&lt;br /&gt;
    y = funcion(x)&lt;br /&gt;
    coeficientes = []&lt;br /&gt;
&lt;br /&gt;
    for k in range(n_terminos):&lt;br /&gt;
        termino_base = np.cos(k * np.pi * x)&lt;br /&gt;
        integrando = 2 * y * termino_base&lt;br /&gt;
        a_k = scipy.integrate.trapezoid(integrando, dx=dx)&lt;br /&gt;
        coeficientes.append(a_k)&lt;br /&gt;
&lt;br /&gt;
    return coeficientes&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def reconstruir_serie_par(coeficientes, x_eval):&lt;br /&gt;
&lt;br /&gt;
    a0 = coeficientes[0]&lt;br /&gt;
    y_approx = (a0 / 2) * np.ones_like(x_eval)&lt;br /&gt;
&lt;br /&gt;
    for k in range(1, len(coeficientes)):&lt;br /&gt;
        a_k = coeficientes[k]&lt;br /&gt;
        y_approx += a_k * np.cos(k * np.pi * x_eval)&lt;br /&gt;
&lt;br /&gt;
    return y_approx&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def f_par_extendida(x):&lt;br /&gt;
&lt;br /&gt;
    return np.where(np.abs(x) &amp;lt;= 0.25, 1.0, 0.0)&lt;br /&gt;
&lt;br /&gt;
def calcular_errores_completo(y_real, y_aprox, dx):&lt;br /&gt;
&lt;br /&gt;
    diff = np.abs(y_real - y_aprox)&lt;br /&gt;
    err_l2 = np.sqrt(scipy.integrate.trapezoid(diff**2, dx=dx))&lt;br /&gt;
    err_unif = np.max(diff)&lt;br /&gt;
    return err_l2, err_unif&lt;br /&gt;
&lt;br /&gt;
def reconstruir_cesaro_par(coeficientes, x_eval):&lt;br /&gt;
&lt;br /&gt;
    N = len(coeficientes) - 1&lt;br /&gt;
    y_approx = np.zeros_like(x_eval)&lt;br /&gt;
&lt;br /&gt;
    denominador = N + 1&lt;br /&gt;
&lt;br /&gt;
    a0 = coeficientes[0]&lt;br /&gt;
    y_approx += (a0 / 2) * np.ones_like(x_eval)&lt;br /&gt;
&lt;br /&gt;
    for k in range(1, len(coeficientes)):&lt;br /&gt;
        a_k = coeficientes[k]&lt;br /&gt;
&lt;br /&gt;
        peso = (N - k + 1) / denominador&lt;br /&gt;
&lt;br /&gt;
        y_approx += peso * a_k * np.cos(k * np.pi * x_eval)&lt;br /&gt;
&lt;br /&gt;
    return y_approx&lt;br /&gt;
&lt;br /&gt;
def reconstruir_lanczos_par(coeficientes, x_eval):&lt;br /&gt;
&lt;br /&gt;
    N = len(coeficientes) - 1&lt;br /&gt;
    y_approx = np.zeros_like(x_eval)&lt;br /&gt;
&lt;br /&gt;
    y_approx += (coeficientes[0] / 2)&lt;br /&gt;
&lt;br /&gt;
    for k in range(1, len(coeficientes)):&lt;br /&gt;
        sigma = np.sinc(k / N)&lt;br /&gt;
        y_approx += sigma * coeficientes[k] * np.cos(k * np.pi * x_eval)&lt;br /&gt;
&lt;br /&gt;
    return y_approx&lt;br /&gt;
&lt;br /&gt;
def reconstruir_abel_r_variable(coeficientes, x_eval, r):&lt;br /&gt;
&lt;br /&gt;
    y_approx = np.zeros_like(x_eval)&lt;br /&gt;
&lt;br /&gt;
    y_approx += (coeficientes[0] / 2)&lt;br /&gt;
&lt;br /&gt;
    for k in range(1, len(coeficientes)):&lt;br /&gt;
        peso = r**k&lt;br /&gt;
        y_approx += peso * coeficientes[k] * np.cos(k * np.pi * x_eval)&lt;br /&gt;
&lt;br /&gt;
    return y_approx&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Gráficas de Fourier&lt;br /&gt;
&lt;br /&gt;
dx_malla = 1e-4&lt;br /&gt;
N_max_calculo = 500&lt;br /&gt;
lista_N_dibujar = [1, 5, 20, 50, 100, 300]&lt;br /&gt;
&lt;br /&gt;
x_completo = np.arange(-1, 1 + dx_malla/10, dx_malla)&lt;br /&gt;
y_real = f_par_extendida(x_completo)&lt;br /&gt;
&lt;br /&gt;
coefs_totales = construir_coeficientes_par(f_par_extendida, N_max_calculo + 1, dx_malla)&lt;br /&gt;
&lt;br /&gt;
plt.figure(figsize=(12, 6))&lt;br /&gt;
&lt;br /&gt;
plt.plot(x_completo, y_real, 'k-', linewidth=2, label='Función Original', alpha=0.3)&lt;br /&gt;
&lt;br /&gt;
colores = plt.cm.magma(np.linspace(0, 0.85, len(lista_N_dibujar)))&lt;br /&gt;
for i, n in enumerate(lista_N_dibujar):&lt;br /&gt;
    coefs_n = coefs_totales[:n+1]&lt;br /&gt;
    y_aprox = reconstruir_serie_par(coefs_n, x_completo)&lt;br /&gt;
&lt;br /&gt;
    plt.plot(x_completo, y_aprox, label=f'N={n}', color=colores[i], linewidth=1.5)&lt;br /&gt;
&lt;br /&gt;
plt.title(f'Gráfica de Fourier en [-1, 1]')&lt;br /&gt;
plt.xlabel('x')&lt;br /&gt;
plt.ylabel('f(x)')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True, alpha=0.3)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
errores_l2 = []&lt;br /&gt;
errores_inf = []&lt;br /&gt;
rango_n = np.arange(1, N_max_calculo + 1)&lt;br /&gt;
&lt;br /&gt;
for n in rango_n:&lt;br /&gt;
    coefs_n = coefs_totales[:n+1]&lt;br /&gt;
    y_aprox = reconstruir_serie_par(coefs_n, x_completo)&lt;br /&gt;
&lt;br /&gt;
    l2, unif = calcular_errores_completo(y_real, y_aprox, dx_malla)&lt;br /&gt;
    errores_l2.append(l2)&lt;br /&gt;
    errores_inf.append(unif)&lt;br /&gt;
&lt;br /&gt;
plt.figure(figsize=(10, 6))&lt;br /&gt;
plt.loglog(rango_n, errores_l2, 'b-o', label='Error L2', markersize=4)&lt;br /&gt;
plt.loglog(rango_n, errores_inf, 'r-s', label='Error Uniforme', markersize=4)&lt;br /&gt;
&lt;br /&gt;
plt.title(f'Errores de Fourier en [-1, 1]')&lt;br /&gt;
plt.xlabel('N (log)')&lt;br /&gt;
plt.ylabel('Error (log)')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True, which=&amp;quot;both&amp;quot;, alpha=0.3)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
# Gráficas de Cesaro&lt;br /&gt;
&lt;br /&gt;
dx_malla = 1e-4&lt;br /&gt;
N_max_calculo = 500&lt;br /&gt;
lista_N_dibujar = [1, 5, 20, 50, 100, 300]&lt;br /&gt;
&lt;br /&gt;
x_completo = np.arange(-1, 1 + dx_malla/10, dx_malla)&lt;br /&gt;
y_real = f_par_extendida(x_completo)&lt;br /&gt;
&lt;br /&gt;
coefs_totales = construir_coeficientes_par(f_par_extendida, N_max_calculo + 1, dx_malla)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
plt.figure(figsize=(10, 6))&lt;br /&gt;
&lt;br /&gt;
plt.plot(x_completo, y_real, 'k-', linewidth=2, label='Función Original', alpha=0.6)&lt;br /&gt;
&lt;br /&gt;
colores = plt.cm.magma(np.linspace(0, 0.85, len(lista_N_dibujar)))&lt;br /&gt;
&lt;br /&gt;
for i, n in enumerate(lista_N_dibujar):&lt;br /&gt;
    coefs_n = coefs_totales[:n+1]&lt;br /&gt;
&lt;br /&gt;
    y_cesaro = reconstruir_cesaro_par(coefs_n, x_completo)&lt;br /&gt;
&lt;br /&gt;
    plt.plot(x_completo, y_cesaro, label=f'N={n}', color=colores[i], linewidth=2)&lt;br /&gt;
&lt;br /&gt;
plt.title(f'Gráfica de Cesàro en [-1, 1]')&lt;br /&gt;
plt.xlabel('x')&lt;br /&gt;
plt.ylabel('S_N(x)')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True, alpha=0.3)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
errores_l2 = []&lt;br /&gt;
errores_inf = []&lt;br /&gt;
rango_n = np.arange(1, N_max_calculo + 1)&lt;br /&gt;
&lt;br /&gt;
for n in rango_n:&lt;br /&gt;
    coefs_n = coefs_totales[:n+1]&lt;br /&gt;
    y_cesaro = reconstruir_cesaro_par(coefs_n, x_completo)&lt;br /&gt;
&lt;br /&gt;
    l2, unif = calcular_errores_completo(y_real, y_cesaro, dx_malla)&lt;br /&gt;
    errores_l2.append(l2)&lt;br /&gt;
    errores_inf.append(unif)&lt;br /&gt;
&lt;br /&gt;
plt.figure(figsize=(10, 6))&lt;br /&gt;
plt.loglog(rango_n, errores_l2, 'b-o', label='Error L2', markersize=4)&lt;br /&gt;
plt.loglog(rango_n, errores_inf, 'r-s', label='Error Uniforme', markersize=4)&lt;br /&gt;
&lt;br /&gt;
plt.title(f'Errores de Cesàro en [-1, 1]')&lt;br /&gt;
plt.xlabel('N (log)')&lt;br /&gt;
plt.ylabel('Error (log)')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True, which=&amp;quot;both&amp;quot;, alpha=0.3)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
# Gráficas de Lanczos&lt;br /&gt;
&lt;br /&gt;
dx_malla = 1e-4&lt;br /&gt;
N_max_calculo = 500&lt;br /&gt;
lista_N_dibujar = [1, 5, 20, 50, 100, 300]&lt;br /&gt;
&lt;br /&gt;
x_completo = np.arange(-1, 1 + dx_malla/10, dx_malla)&lt;br /&gt;
y_real = f_par_extendida(x_completo)&lt;br /&gt;
&lt;br /&gt;
coefs_totales = construir_coeficientes_par(f_par_extendida, N_max_calculo + 1, dx_malla)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
plt.figure(figsize=(10, 6))&lt;br /&gt;
plt.plot(x_completo, y_real, 'k-', linewidth=2, label='Función Original', alpha=0.5)&lt;br /&gt;
&lt;br /&gt;
colores = plt.cm.viridis(np.linspace(0, 0.9, len(lista_N_dibujar)))&lt;br /&gt;
&lt;br /&gt;
for i, n in enumerate(lista_N_dibujar):&lt;br /&gt;
    coefs_n = coefs_totales[:n+1]&lt;br /&gt;
    y_lanczos = reconstruir_lanczos_par(coefs_n, x_completo)&lt;br /&gt;
&lt;br /&gt;
    plt.plot(x_completo, y_lanczos, label=f'N={n}', color=colores[i])&lt;br /&gt;
&lt;br /&gt;
plt.title(f'Gráfica de Lanczos en [-1, 1]')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True, alpha=0.3)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
errores_l2 = []&lt;br /&gt;
errores_inf = []&lt;br /&gt;
rango_n = np.arange(1, N_max_calculo + 1)&lt;br /&gt;
&lt;br /&gt;
for n in rango_n:&lt;br /&gt;
    coefs_n = coefs_totales[:n+1]&lt;br /&gt;
    y_lanczos = reconstruir_lanczos_par(coefs_n, x_completo)&lt;br /&gt;
&lt;br /&gt;
    l2, unif = calcular_errores_completo(y_real, y_lanczos, dx_malla)&lt;br /&gt;
    errores_l2.append(l2)&lt;br /&gt;
    errores_inf.append(unif)&lt;br /&gt;
&lt;br /&gt;
plt.figure(figsize=(10, 6))&lt;br /&gt;
plt.loglog(rango_n, errores_l2, 'b-o', label='Error L2', markersize=4)&lt;br /&gt;
plt.loglog(rango_n, errores_inf, 'r-s', label='Error Uniforme', markersize=4)&lt;br /&gt;
plt.title(f'Errores de Lanczos en [-1, 1]')&lt;br /&gt;
plt.xlabel('N (log)')&lt;br /&gt;
plt.ylabel('Error (log)')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True, which=&amp;quot;both&amp;quot;, alpha=0.3)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Gráficas de Abel&lt;br /&gt;
&lt;br /&gt;
dx_malla = 1e-4&lt;br /&gt;
N_FIJO = 300&lt;br /&gt;
lista_r_dibujar = [0.6, 0.8, 0.9, 0.95, 0.99, 0.999]&lt;br /&gt;
&lt;br /&gt;
x_completo = np.arange(-1, 1 + dx_malla/10, dx_malla)&lt;br /&gt;
y_real = f_par_extendida(x_completo)&lt;br /&gt;
&lt;br /&gt;
coefs_fijos = construir_coeficientes_par(f_par_extendida, N_FIJO + 1, dx_malla)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
plt.figure(figsize=(10, 6))&lt;br /&gt;
plt.plot(x_completo, y_real, 'k-', linewidth=2, label='Función Original', alpha=0.3)&lt;br /&gt;
&lt;br /&gt;
colores = plt.cm.Blues(np.linspace(0.4, 1.0, len(lista_r_dibujar)))&lt;br /&gt;
&lt;br /&gt;
for i, r_val in enumerate(lista_r_dibujar):&lt;br /&gt;
    y_abel = reconstruir_abel_r_variable(coefs_fijos, x_completo, r_val)&lt;br /&gt;
&lt;br /&gt;
    plt.plot(x_completo, y_abel, label=f'r={r_val}', color=colores[i], linewidth=1.5)&lt;br /&gt;
&lt;br /&gt;
plt.title(f'Gráfica de Abel en [-1, 1]')&lt;br /&gt;
plt.xlabel('x')&lt;br /&gt;
plt.ylabel('A_r(x)')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True, alpha=0.3)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
r_range = np.linspace(0.5, 0.999, 100)&lt;br /&gt;
&lt;br /&gt;
errores_l2 = []&lt;br /&gt;
errores_inf = []&lt;br /&gt;
&lt;br /&gt;
for r_val in r_range:&lt;br /&gt;
    y_abel = reconstruir_abel_r_variable(coefs_fijos, x_completo, r_val)&lt;br /&gt;
&lt;br /&gt;
    l2, unif = calcular_errores_completo(y_real, y_abel, dx_malla)&lt;br /&gt;
    errores_l2.append(l2)&lt;br /&gt;
    errores_inf.append(unif)&lt;br /&gt;
&lt;br /&gt;
plt.figure(figsize=(10, 6))&lt;br /&gt;
plt.loglog(r_range, errores_l2, 'b-o', label='Error L2', markersize=4)&lt;br /&gt;
plt.loglog(r_range, errores_inf, 'r-s', label='Error Uniforme', markersize=4)&lt;br /&gt;
plt.title(f'Errores de Abel en [-1, 1]')&lt;br /&gt;
plt.xlabel('r (log)')&lt;br /&gt;
plt.ylabel('Error (log)')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True, which=&amp;quot;both&amp;quot;, alpha=0.3)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Categoría:EDP]]&lt;br /&gt;
[[Categoría:EDP25/26]]&lt;/div&gt;</summary>
		<author><name>Alejandro.mates</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/wiki/Series_de_Fourier_EPNL</id>
		<title>Series de Fourier EPNL</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/wiki/Series_de_Fourier_EPNL"/>
				<updated>2026-02-18T18:28:15Z</updated>
		
		<summary type="html">&lt;p&gt;Noe.rico: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ TrabajoED | Series de Fourier. Grupo EPNL | [[:Categoría:EDP|EDP]]|[[:Categoría:EDP25/26|2025-26]] | Elsa Coutelenq&lt;br /&gt;
&lt;br /&gt;
Paula León&lt;br /&gt;
&lt;br /&gt;
Noé Rico&lt;br /&gt;
&lt;br /&gt;
Leo Zambrano  }}&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Poster_EPNL.png||900px]]&lt;br /&gt;
[[Archivo:Poster_EPNL.pdf]]&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
=CODIGO 1 =&lt;br /&gt;
El primer código para visualizar las series de fourier con coeficientes normales (0,1) es el siguiente:&lt;br /&gt;
&amp;lt;source lang: &amp;quot;Matlab&amp;quot; line&amp;gt;&lt;br /&gt;
x = linspace(-pi, pi, 4000);&lt;br /&gt;
Ns = [10, 20, 50, 100];&lt;br /&gt;
&lt;br /&gt;
figure&lt;br /&gt;
&lt;br /&gt;
for k = 1:length(Ns)&lt;br /&gt;
    &lt;br /&gt;
    N = Ns(k);&lt;br /&gt;
    &lt;br /&gt;
    A = randn(1,N);&lt;br /&gt;
    B = randn(1,N);&lt;br /&gt;
    &lt;br /&gt;
    f = zeros(size(x));&lt;br /&gt;
    for n = 1:N&lt;br /&gt;
        f = f + A(n)*cos(n*x) + B(n)*sin(n*x);&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    subplot(2,2,k)&lt;br /&gt;
    plot(x, f, 'DisplayName', ['N = ' num2str(N)])&lt;br /&gt;
    xlim([-pi pi])&lt;br /&gt;
    ylim([-30 30])&lt;br /&gt;
    legend show&lt;br /&gt;
    grid on&lt;br /&gt;
    &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
sgtitle('Serie de Fourier con coeficientes N(0,1)')&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=CODIGO 2=&lt;br /&gt;
El código para la simulación de la probabilidad mediante Monte Carlo es:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang: &amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
# -------------------------&lt;br /&gt;
# Parámetros del modelo&lt;br /&gt;
# -------------------------&lt;br /&gt;
L = np.pi&lt;br /&gt;
N = 30&lt;br /&gt;
seed = 0&lt;br /&gt;
&lt;br /&gt;
M = 3000&lt;br /&gt;
ells = np.array([1e-3, 2e-3, 5e-3, 1e-2, 2e-2, 5e-2, 0.1, 0.2, 0.4, 0.7, 1.0, L])&lt;br /&gt;
&lt;br /&gt;
# Malla adaptativa (densidad constante)&lt;br /&gt;
points_per_unit = 120&lt;br /&gt;
Jmin, Jmax = 11, 500&lt;br /&gt;
&lt;br /&gt;
rng = np.random.default_rng(seed)&lt;br /&gt;
&lt;br /&gt;
n = np.arange(1, N + 1)&lt;br /&gt;
&lt;br /&gt;
def sample_coeffs():&lt;br /&gt;
    A0 = rng.normal(0.0, 1.0)&lt;br /&gt;
    A = rng.normal(0.0, 1.0, size=N)&lt;br /&gt;
    B = rng.normal(0.0, 1.0, size=N)&lt;br /&gt;
    return A0, A, B&lt;br /&gt;
&lt;br /&gt;
def eval_f_on_grid(xgrid, A0, A, B):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    Evalúa la serie de Fourier en los puntos xgrid&lt;br /&gt;
    &lt;br /&gt;
    Args:&lt;br /&gt;
        xgrid: array de puntos donde evaluar (J,)&lt;br /&gt;
        A0: término constante (escalar)&lt;br /&gt;
        A: coeficientes coseno (N,)&lt;br /&gt;
        B: coeficientes seno (N,)&lt;br /&gt;
    &lt;br /&gt;
    Returns:&lt;br /&gt;
        f: array (J,) con los valores de la función&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    # Crear matriz theta: (J, N) donde theta[j, n-1] = (π/L) * xgrid[j] * n&lt;br /&gt;
    theta = (np.pi / L) * np.outer(xgrid, n)&lt;br /&gt;
    &lt;br /&gt;
    # Calcular la serie de Fourier sin usar @&lt;br /&gt;
    # Para cada punto x, sumamos sobre n: A_n*cos(theta_n) + B_n*sin(theta_n)&lt;br /&gt;
    cos_terms = np.cos(theta) * A  # Multiplicación elemento a elemento, luego se suma sobre n&lt;br /&gt;
    sin_terms = np.sin(theta) * B&lt;br /&gt;
    &lt;br /&gt;
    # Sumar sobre el eje de los términos (axis=1)&lt;br /&gt;
    f = A0 + np.sum(cos_terms, axis=1) + np.sum(sin_terms, axis=1)&lt;br /&gt;
    &lt;br /&gt;
    return f&lt;br /&gt;
&lt;br /&gt;
# -------------------------&lt;br /&gt;
# Monte Carlo para cada longitud&lt;br /&gt;
# -------------------------&lt;br /&gt;
lengths = ells&lt;br /&gt;
p_hats = []&lt;br /&gt;
&lt;br /&gt;
for ell, length in zip(ells, lengths):&lt;br /&gt;
    a, b = -ell, ell&lt;br /&gt;
&lt;br /&gt;
    Jell = int(np.clip(np.ceil(points_per_unit * length), Jmin, Jmax))&lt;br /&gt;
    xgrid = np.linspace(a, b, Jell)&lt;br /&gt;
&lt;br /&gt;
    success = 0&lt;br /&gt;
    for _ in range(M):&lt;br /&gt;
        A0, A, B = sample_coeffs()&lt;br /&gt;
        f = eval_f_on_grid(xgrid, A0, A, B)&lt;br /&gt;
        if np.all(f &amp;gt;= 0):&lt;br /&gt;
            success += 1&lt;br /&gt;
&lt;br /&gt;
    p_hat = success / M&lt;br /&gt;
    p_hats.append(p_hat)&lt;br /&gt;
    print(f&amp;quot;longitud={length:.4g} (ℓ={ell:.4g}) | J={Jell:3d} | p_hat={p_hat:.4f} | {success}/{M}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
p_hats = np.array(p_hats, dtype=float)&lt;br /&gt;
&lt;br /&gt;
# -------------------------&lt;br /&gt;
# Plot: Probabilidad vs Longitud&lt;br /&gt;
# -------------------------&lt;br /&gt;
plt.figure(figsize=(8, 5))&lt;br /&gt;
plt.plot(lengths, p_hats, marker=&amp;quot;o&amp;quot;, linewidth=1.8)&lt;br /&gt;
&lt;br /&gt;
plt.title(&amp;quot;Probabilidad estimada vs L&amp;quot;)&lt;br /&gt;
plt.xlabel(&amp;quot;L&amp;quot;)&lt;br /&gt;
plt.ylabel(r&amp;quot;$\mathbb{P}(f_\sigma(x) ≥ 0, \forall x, \in [-L,L])$&amp;quot;)&lt;br /&gt;
plt.grid(True, alpha=0.3)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
plt.tight_layout()&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=CODIGO 3 Y 4=&lt;br /&gt;
El código para las normales (0,&amp;lt;math&amp;gt;1/n&amp;lt;/math&amp;gt;) y (0,&amp;lt;math&amp;gt;1/n^2&amp;lt;/math&amp;gt;) es el siguiente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang: &amp;quot;Matlab&amp;quot; line&amp;gt;&lt;br /&gt;
&lt;br /&gt;
%Fourier N(0,1/n)&lt;br /&gt;
&lt;br /&gt;
x = linspace(-pi, pi, 4000);&lt;br /&gt;
Ns = [100, 200, 500, 1000];&lt;br /&gt;
&lt;br /&gt;
figure&lt;br /&gt;
&lt;br /&gt;
for k = 1:length(Ns)&lt;br /&gt;
    &lt;br /&gt;
    N = Ns(k);&lt;br /&gt;
    n = 1:N;&lt;br /&gt;
    &lt;br /&gt;
    % Desviación típica = 1/n&lt;br /&gt;
    A = (1./n) .* randn(1,N);&lt;br /&gt;
    B = (1./n) .* randn(1,N);&lt;br /&gt;
    &lt;br /&gt;
    f = zeros(size(x));&lt;br /&gt;
    for j = 1:N&lt;br /&gt;
        f = f + A(j)*cos(j*x) + B(j)*sin(j*x);&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    subplot(2,2,k)&lt;br /&gt;
    plot(x, f, 'DisplayName', ['N = ' num2str(N)])&lt;br /&gt;
    xlim([-pi pi])&lt;br /&gt;
    ylim([-5 5])&lt;br /&gt;
    legend show&lt;br /&gt;
    grid on&lt;br /&gt;
    &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
sgtitle('Serie de Fourier con A_n,B_n ~ N(0, 1/n)')&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%Fourier N(0,1/n^2)&lt;br /&gt;
x = linspace(-pi, pi, 4000);&lt;br /&gt;
Ns = [100, 200, 500, 1000];&lt;br /&gt;
&lt;br /&gt;
figure&lt;br /&gt;
&lt;br /&gt;
for k = 1:length(Ns)&lt;br /&gt;
    &lt;br /&gt;
    N = Ns(k);&lt;br /&gt;
    n = 1:N;&lt;br /&gt;
    &lt;br /&gt;
    % Desviación típica = 1/n&lt;br /&gt;
    A = (1./n.^2) .* randn(1,N);&lt;br /&gt;
    B = (1./n.^2) .* randn(1,N);&lt;br /&gt;
    &lt;br /&gt;
    f = zeros(size(x));&lt;br /&gt;
    for j = 1:N&lt;br /&gt;
        f = f + A(j)*cos(j*x) + B(j)*sin(j*x);&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    subplot(2,2,k)&lt;br /&gt;
    plot(x, f, 'DisplayName', ['N = ' num2str(N)])&lt;br /&gt;
    xlim([-pi pi])&lt;br /&gt;
    ylim([-5 5])&lt;br /&gt;
    legend show&lt;br /&gt;
    grid on&lt;br /&gt;
    &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
sgtitle('Serie de Fourier con A_n,B_n ~ N(0, 1/n^2)')&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Categoría:EDP]]&lt;br /&gt;
[[Categoría:EDP25/26]]&lt;/div&gt;</summary>
		<author><name>Noe.rico</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/wiki/Series_de_Fourier_MAM</id>
		<title>Series de Fourier MAM</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/wiki/Series_de_Fourier_MAM"/>
				<updated>2026-02-18T15:44:18Z</updated>
		
		<summary type="html">&lt;p&gt;Mario Alonso: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ TrabajoED | Series de Fourier. Grupo MAM| [[:Categoría:EDP|EDP]]|[[:Categoría:EDP25/26|2025-26]] | Mario Alonso Rodríguez&lt;br /&gt;
&lt;br /&gt;
Adrián Nieto Moreno&lt;br /&gt;
&lt;br /&gt;
Matías Martínez Mancebo}}&lt;br /&gt;
&lt;br /&gt;
[[Archivo:POSTER_FOURIER_MAM.png||800px]]&lt;br /&gt;
[[Archivo:POSTERFOURIER_mam.pdf]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Abajo se puede ver el código que se ha utilizado para conseguir las gráficas:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
# -----------------------------&lt;br /&gt;
# Funciones objetivo&lt;br /&gt;
# -----------------------------&lt;br /&gt;
def signo(x):&lt;br /&gt;
    return np.sign(x)&lt;br /&gt;
&lt;br /&gt;
def integral_signo(x):&lt;br /&gt;
    return np.abs(x)&lt;br /&gt;
&lt;br /&gt;
def derivada_signo(x):&lt;br /&gt;
    # Derivada clásica: 0 para x != 0 (en x=0 no existe; ignoramos el delta)&lt;br /&gt;
    return np.zeros_like(x)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# -----------------------------&lt;br /&gt;
# Serie de Fourier de signo(x)&lt;br /&gt;
# signo(x) ~ (4/pi) * sum_{k=1..n} sin((2k-1)x)/(2k-1)&lt;br /&gt;
# -----------------------------&lt;br /&gt;
def serie_fourier_signo(x, n):&lt;br /&gt;
    k = np.arange(1, n + 1)&lt;br /&gt;
    m = 2 * k - 1  # impares&lt;br /&gt;
    # sum over m: sin(m x)/m&lt;br /&gt;
    return (4 / np.pi) * np.sum(np.sin(np.outer(m, x)) / m[:, None], axis=0)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# -----------------------------&lt;br /&gt;
# Integral de la serie (aprox de |x|)&lt;br /&gt;
# |x| = pi/2 - (4/pi) * sum_{k=1..∞} cos((2k-1)x)/(2k-1)^2&lt;br /&gt;
# -----------------------------&lt;br /&gt;
def integral_serie_fourier_signo(x, n):&lt;br /&gt;
    k = np.arange(1, n + 1)&lt;br /&gt;
    m = 2 * k - 1&lt;br /&gt;
    return (np.pi / 2) - (4 / np.pi) * np.sum(np.cos(np.outer(m, x)) / (m[:, None] ** 2), axis=0)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# -----------------------------&lt;br /&gt;
# Derivada de la serie (ojo: no converge a la derivada clásica en x=0)&lt;br /&gt;
# d/dx [serie] = (4/pi) * sum_{k=1..n} cos((2k-1)x)&lt;br /&gt;
# -----------------------------&lt;br /&gt;
def derivada_serie_fourier_signo(x, n):&lt;br /&gt;
    k = np.arange(1, n + 1)&lt;br /&gt;
    m = 2 * k - 1&lt;br /&gt;
    return (4 / np.pi) * np.sum(np.cos(np.outer(m, x)), axis=0)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# -----------------------------&lt;br /&gt;
# Norma L2: ||f-g||_2 = sqrt( ∫ |f-g|^2 dx )&lt;br /&gt;
# (integral numérica con trapecios)&lt;br /&gt;
# -----------------------------&lt;br /&gt;
def l2_error(x, f, g):&lt;br /&gt;
    return np.sqrt(np.trapz((f - g) ** 2, x))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# -----------------------------&lt;br /&gt;
# Plantilla: figura (aprox) + (error L2 vs n)&lt;br /&gt;
# -----------------------------&lt;br /&gt;
def figura_aprox_y_error(&lt;br /&gt;
    x,&lt;br /&gt;
    f_true_func,&lt;br /&gt;
    f_aprox_func,&lt;br /&gt;
    titulo_izq,&lt;br /&gt;
    titulo_der,&lt;br /&gt;
    n_list_plot=(5, 10, 30),&lt;br /&gt;
    n_max_error=200,&lt;br /&gt;
    ylims_izq=None&lt;br /&gt;
):&lt;br /&gt;
    f_true = f_true_func(x)&lt;br /&gt;
&lt;br /&gt;
    fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(14, 5))&lt;br /&gt;
&lt;br /&gt;
    # --- Izquierda: curvas ---&lt;br /&gt;
    ax1.plot(x, f_true, linewidth=3, label=&amp;quot;Función objetivo&amp;quot;, color=&amp;quot;black&amp;quot;)&lt;br /&gt;
    for n in n_list_plot:&lt;br /&gt;
        ax1.plot(x, f_aprox_func(x, n), linewidth=2, label=f&amp;quot;Fourier (n={n})&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    ax1.set_title(titulo_izq)&lt;br /&gt;
    ax1.set_xlabel(&amp;quot;x&amp;quot;)&lt;br /&gt;
    ax1.set_ylabel(&amp;quot;y&amp;quot;)&lt;br /&gt;
    ax1.grid(True, alpha=0.3)&lt;br /&gt;
    ax1.legend()&lt;br /&gt;
    if ylims_izq is not None:&lt;br /&gt;
        ax1.set_ylim(ylims_izq)&lt;br /&gt;
&lt;br /&gt;
    # --- Derecha: error L2 vs n ---&lt;br /&gt;
    ns = np.arange(1, n_max_error + 1)&lt;br /&gt;
    errs = np.array([l2_error(x, f_true, f_aprox_func(x, n)) for n in ns])&lt;br /&gt;
&lt;br /&gt;
    ax2.plot(ns, errs, linewidth=2, label=r&amp;quot;Error $L^2$: $||f - S_n||_2$&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    # marcar los n usados en la izquierda&lt;br /&gt;
    for n in n_list_plot:&lt;br /&gt;
        ax2.scatter([n], [errs[n - 1]], s=60)&lt;br /&gt;
&lt;br /&gt;
    ax2.set_title(titulo_der)&lt;br /&gt;
    ax2.set_xlabel(&amp;quot;n&amp;quot;)&lt;br /&gt;
    ax2.set_ylabel(r&amp;quot;$||f - S_n||_2$&amp;quot;)&lt;br /&gt;
    ax2.grid(True, alpha=0.3)&lt;br /&gt;
    ax2.legend()&lt;br /&gt;
&lt;br /&gt;
    plt.tight_layout()&lt;br /&gt;
    plt.show()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# -----------------------------&lt;br /&gt;
# Dominio (más puntos =&amp;gt; integral numérica más estable)&lt;br /&gt;
# -----------------------------&lt;br /&gt;
x = np.linspace(-np.pi, np.pi, 4000)&lt;br /&gt;
&lt;br /&gt;
# Elige los n que quieres dibujar en la izquierda&lt;br /&gt;
n_list = (5, 10, 30)&lt;br /&gt;
&lt;br /&gt;
# 1) signo(x)&lt;br /&gt;
figura_aprox_y_error(&lt;br /&gt;
    x,&lt;br /&gt;
    f_true_func=signo,&lt;br /&gt;
    f_aprox_func=serie_fourier_signo,&lt;br /&gt;
    titulo_izq=&amp;quot;Aproximación por series de Fourier de la función signo&amp;quot;,&lt;br /&gt;
    titulo_der=r&amp;quot;Error $L^2$ vs $n$&amp;quot;,&lt;br /&gt;
    n_list_plot=n_list,&lt;br /&gt;
    n_max_error=200,&lt;br /&gt;
    ylims_izq=(-1.5, 1.5)&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
# 2) Integral -&amp;gt; |x|&lt;br /&gt;
figura_aprox_y_error(&lt;br /&gt;
    x,&lt;br /&gt;
    f_true_func=integral_signo,&lt;br /&gt;
    f_aprox_func=integral_serie_fourier_signo,&lt;br /&gt;
    titulo_izq=&amp;quot;Integral: aproximación de |x| mediante Fourier&amp;quot;,&lt;br /&gt;
    titulo_der=r&amp;quot;Error $L^2$ vs $n$ (integral)&amp;quot;,&lt;br /&gt;
    n_list_plot=(1, 3, 5),  # menos n porque converge más rápido&lt;br /&gt;
    n_max_error=200,&lt;br /&gt;
    ylims_izq=(0, np.pi)&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
# 3) Derivada (comparada con 0)&lt;br /&gt;
# Nota: este “error” no tenderá a 0, porque la derivada real incluye una singularidad en 0.&lt;br /&gt;
figura_aprox_y_error(&lt;br /&gt;
    x,&lt;br /&gt;
    f_true_func=derivada_signo,&lt;br /&gt;
    f_aprox_func=derivada_serie_fourier_signo,&lt;br /&gt;
    titulo_izq=&amp;quot;Derivada de la serie de Fourier (comparada con 0)&amp;quot;,&lt;br /&gt;
    titulo_der=r&amp;quot;Error $L^2$ vs $n$ (derivada)&amp;quot;,&lt;br /&gt;
    n_list_plot=n_list,&lt;br /&gt;
    n_max_error=200,&lt;br /&gt;
    ylims_izq=(-10, 10)&lt;br /&gt;
)   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Bibliografía ==&lt;br /&gt;
&lt;br /&gt;
* [https://mat.caminos.upm.es/wiki/Categor%C3%ADa:EDP Categoría: EDP], MateWiki, Universidad Politécnica de Madrid.&lt;br /&gt;
&lt;br /&gt;
* Sanders, J. A.; Verhulst, F.; Murdock, J., ''Partial Differential Equations in Action: From Modelling to Theory'', Springer, 2016.&lt;br /&gt;
&lt;br /&gt;
* Evans, L. C., ''Partial Differential Equations'', Graduate Studies in Mathematics, Vol. 19, American Mathematical Society, 2010.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Categoría:EDP]]&lt;br /&gt;
[[Categoría:EDP25/26]]&lt;/div&gt;</summary>
		<author><name>Adrián Nieto</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/wiki/Series_de_Fourier_AAN</id>
		<title>Series de Fourier AAN</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/wiki/Series_de_Fourier_AAN"/>
				<updated>2026-02-18T15:27:21Z</updated>
		
		<summary type="html">&lt;p&gt;Ainhoa: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ TrabajoED | Series de Fourier. Grupo NAA| [[:Categoría:EDP|EDP]]|[[:Categoría:EDP25/26|2025-26]] | Natalia Gutiérrez de Uriarte &lt;br /&gt;
&lt;br /&gt;
Alba Peralta Zamora&lt;br /&gt;
&lt;br /&gt;
Ainhoa Martín García}}&lt;br /&gt;
&lt;br /&gt;
[[Archivo:series fourier naa.jpg|800px|right|]]&lt;br /&gt;
&lt;br /&gt;
A continuación, se van a mostrar los códigos que se han utilizado para representar cada una de las gráficas del trabajo. Todos ellos han sido escritos en Matlab.&lt;br /&gt;
&lt;br /&gt;
Código para representar la aproximación por serie de Fourier.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot; line&amp;gt;&lt;br /&gt;
&lt;br /&gt;
clear; clc; close all;&lt;br /&gt;
&lt;br /&gt;
% Dominio&lt;br /&gt;
x = linspace(-pi, pi, 1000);&lt;br /&gt;
&lt;br /&gt;
% Onda cuadrada original&lt;br /&gt;
f = sign(sin(x));&lt;br /&gt;
figure&lt;br /&gt;
plot(x, f, 'k')&lt;br /&gt;
hold on&lt;br /&gt;
% Número de términos de Fourier&lt;br /&gt;
N = [1 5 10 20 50 100];&lt;br /&gt;
colores = {'r', 'b', 'g', 'y', 'm', 'c'};&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
for i=1:length(N)&lt;br /&gt;
    % Inicializar aproximación&lt;br /&gt;
    fourier = zeros(size(x));&lt;br /&gt;
    % Construcción de la serie&lt;br /&gt;
    for n = 1:2:(2*N(i)-1)&lt;br /&gt;
        fourier = fourier + (1/n)*sin(n*x);&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    fourier = (4/pi) * fourier;&lt;br /&gt;
    &lt;br /&gt;
   % Graficar fourier con N distinto&lt;br /&gt;
    plot(x, fourier, colores{i})&lt;br /&gt;
    grid on&lt;br /&gt;
    &lt;br /&gt;
end&lt;br /&gt;
legend('f(x)', 'N=1', 'N=5', 'N=10', 'N=20', 'N=50', 'N=100')&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Código para representar el error con Fourier.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot; line&amp;gt;&lt;br /&gt;
%error en L2&lt;br /&gt;
&lt;br /&gt;
clear; clc; close all;&lt;br /&gt;
&lt;br /&gt;
% Dominio&lt;br /&gt;
x = linspace(-pi, pi, 10000);  % Más puntos para mejor precisión&lt;br /&gt;
&lt;br /&gt;
% Onda cuadrada original&lt;br /&gt;
f = sign(sin(x));&lt;br /&gt;
&lt;br /&gt;
% Número de términos de Fourier&lt;br /&gt;
N = [1 5 10 20 50 100];&lt;br /&gt;
error_norma2 = zeros(size(N));  % Guardar errores&lt;br /&gt;
&lt;br /&gt;
for i = 1:length(N)&lt;br /&gt;
    % Inicializar aproximación&lt;br /&gt;
    fourier = zeros(size(x));&lt;br /&gt;
    &lt;br /&gt;
    % Construcción de la serie (solo impares)&lt;br /&gt;
    for n = 1:2:(2*N(i)-1)&lt;br /&gt;
        fourier = fourier + (1/n) * sin(n*x);&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    fourier = (4/pi) * fourier;&lt;br /&gt;
    &lt;br /&gt;
    % Calcular error norma L²&lt;br /&gt;
    diferencia = f - fourier;&lt;br /&gt;
    norma2 = sqrt((1/(2*pi)) * trapz(x, diferencia.^2));&lt;br /&gt;
    &lt;br /&gt;
    % Guardar el error&lt;br /&gt;
    error_norma2(i) = norma2;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% Gráfica del error en norma L²&lt;br /&gt;
figure&lt;br /&gt;
plot(k, error_norma2, 'bo-', 'LineWidth', 2, 'MarkerSize', 8)&lt;br /&gt;
grid on&lt;br /&gt;
title('Error en norma L^2 de la aproximación de Fourier')&lt;br /&gt;
xlabel('Número de términos (N)')&lt;br /&gt;
ylabel('||f - S_N||_2')&lt;br /&gt;
xlim([0, max(N)+5])&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Código para representar las aproximaciones con Cesàro.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot; line&amp;gt;&lt;br /&gt;
clear; clc; close all;&lt;br /&gt;
&lt;br /&gt;
% Dominio&lt;br /&gt;
x = linspace(-pi, pi, 2000);&lt;br /&gt;
&lt;br /&gt;
% Onda cuadrada original&lt;br /&gt;
f = sign(sin(x));&lt;br /&gt;
&lt;br /&gt;
% Número de términos&lt;br /&gt;
 N= [1 5 10 20 50 100];   % prueba 20, 50, 100...&lt;br /&gt;
colores = {'r', 'b', 'g', 'y', 'm', 'c'};&lt;br /&gt;
&lt;br /&gt;
figure&lt;br /&gt;
plot(x, f, 'k')&lt;br /&gt;
hold on&lt;br /&gt;
&lt;br /&gt;
for i=1:length(N)&lt;br /&gt;
    % Inicializar suma de Cesàro&lt;br /&gt;
    cesaro = zeros(size(x));&lt;br /&gt;
&lt;br /&gt;
    % Construcción (solo impares)&lt;br /&gt;
    for n = 1:2:(2*N(i)-1)&lt;br /&gt;
        weight = 1 - (n/(2*N(i)));   % factor de Cesàro&lt;br /&gt;
        cesaro = cesaro + weight*(1/n)*sin(n*x);&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    cesaro = (4/pi)*cesaro;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
    plot(x, cesaro, colores{i})&lt;br /&gt;
    grid on&lt;br /&gt;
    &lt;br /&gt;
end&lt;br /&gt;
legend('f(x)', 'N=1', 'N=5', 'N=10', 'N=20', 'N=50', 'N=100')&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Código para el error con Cesàro.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot; line&amp;gt;&lt;br /&gt;
clear; clc; close all;&lt;br /&gt;
&lt;br /&gt;
% Dominio&lt;br /&gt;
x = linspace(-pi, pi, 10000);  % Más puntos para mejor precisión&lt;br /&gt;
&lt;br /&gt;
% Onda cuadrada original&lt;br /&gt;
f = sign(sin(x));&lt;br /&gt;
&lt;br /&gt;
% Valores de N&lt;br /&gt;
N = [1 5 10 20 50 100];&lt;br /&gt;
error_norma2 = zeros(size(N));  % Guardar errores&lt;br /&gt;
&lt;br /&gt;
for i = 1:length(N)&lt;br /&gt;
&lt;br /&gt;
    % Inicializar suma de Cesàro&lt;br /&gt;
    cesaro = zeros(size(x));&lt;br /&gt;
&lt;br /&gt;
    % Construcción (solo impares)&lt;br /&gt;
    for n = 1:2:(2*N(i)-1)&lt;br /&gt;
        weight = 1 - (n/(2*N(i)));&lt;br /&gt;
        cesaro = cesaro + weight*(1/n)*sin(n*x);&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    cesaro = (4/pi)*cesaro;&lt;br /&gt;
&lt;br /&gt;
    % Calcular error norma L²&lt;br /&gt;
    diferencia = f - cesaro;&lt;br /&gt;
    norma2 = sqrt((1/(2*pi)) * trapz(x, diferencia.^2));&lt;br /&gt;
    &lt;br /&gt;
    % Guardar el error&lt;br /&gt;
    error_norma2(i) = norma2;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% Gráfica del error en norma L²&lt;br /&gt;
figure&lt;br /&gt;
plot(k, error_norma2, 'bo-', 'LineWidth', 2, 'MarkerSize', 8)&lt;br /&gt;
grid on&lt;br /&gt;
title('Error en norma L^2 - Suma de Cesàro')&lt;br /&gt;
xlabel('Número de términos (N)')&lt;br /&gt;
ylabel('||f - \sigma_N||_2')&lt;br /&gt;
xlim([0, max(N)+5])&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''REFERENCIAS'''&lt;br /&gt;
&lt;br /&gt;
*[https://mat.caminos.upm.es/wiki/Categor%C3%ADa:EDP24/25 Matewiki]&lt;br /&gt;
*[https://www.etsist.upm.es/uploaded/docs_personales/hernandez_heredero_rafael_jose/old/CalI/CIT6.pdf R.J. Hernández Heredero, UPM]&lt;br /&gt;
*[https://docta.ucm.es/rest/api/core/bitstreams/f0559a49-2b27-4e4d-a5d0-12633ce93153/content P. Diago Nañez, UCM]&lt;br /&gt;
*[https://riull.ull.es/xmlui/bitstream/handle/915/15738/Series%20de%20Fourier.pdf?sequence=1 Jonathan E. Chirinos Rodríguez, TFG]&lt;br /&gt;
*''Partial Differential Equations in Action, From Modelling to Theory, Fourth Edition.''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Categoría:EDP]]&lt;br /&gt;
[[Categoría:EDP25/26]]&lt;/div&gt;</summary>
		<author><name>Ainhoa</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/wiki/EDP-Trabajo_1</id>
		<title>EDP-Trabajo 1</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/wiki/EDP-Trabajo_1"/>
				<updated>2026-02-16T17:23:40Z</updated>
		
		<summary type="html">&lt;p&gt;Alejandro.mates: Página reemplazada por «hola»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;hola&lt;/div&gt;</summary>
		<author><name>Alejandro.mates</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/wiki/Serie_de_Fourier_L%C3%81J</id>
		<title>Serie de Fourier LÁJ</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/wiki/Serie_de_Fourier_L%C3%81J"/>
				<updated>2026-02-16T16:10:14Z</updated>
		
		<summary type="html">&lt;p&gt;Álvaro Moreno: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ TrabajoED | Series de Fourier. Grupo LÁJ| [[:Categoría:EDP|EDP]]|[[:Categoría:EDP25/26|2025-26]] | Luis García Suárez&lt;br /&gt;
&lt;br /&gt;
Álvaro Moreno Cisneros&lt;br /&gt;
&lt;br /&gt;
Juan Pérez Guerra }}&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Series de fourier LÁJ.jpeg||800px]]&lt;br /&gt;
[[Medio:Series de fourier LÁJ corregido.pdf | PDF del póster]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Abajo se puede ver el código que se ha utilizado para conseguir las gráficas. La función serie_de_fourier_definitiva aproxima una función dada en un intervalo mediante una serie de Fourier, la función comparar_fourier_cesaro es la que da las gráficas de la última parte y la función base_trigonométrica aunque no se ha incluído en el póster ilustra como funciona la base trigonométrica.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
from scipy.integrate import trapezoid&lt;br /&gt;
&lt;br /&gt;
def base_trigonometrica(n):&lt;br /&gt;
	#Puntos donde se grafica&lt;br /&gt;
	x = np.linspace(-1,1,1000)&lt;br /&gt;
	plt.figure(figsize = (10,6))&lt;br /&gt;
&lt;br /&gt;
	#Primer término de la serie&lt;br /&gt;
	plt.plot(x, np.full_like(x, 0.5), label='1/2 (n=0)', linewidth=2, color='black')&lt;br /&gt;
&lt;br /&gt;
	#Términos trigonométricos&lt;br /&gt;
	for n in range(1,n):&lt;br /&gt;
		plt.plot(x, np.cos(n*np.pi*x), color = 'r', linestyle='-')&lt;br /&gt;
		plt.plot(x, np.sin(n*np.pi*x), color = 'b', linestyle='-')&lt;br /&gt;
&lt;br /&gt;
	plt.title('Primeros términos de la base trigonométrica {1/2, cos(nπx), sin(nπx)}')&lt;br /&gt;
	plt.xlabel('x')&lt;br /&gt;
	plt.ylabel('f(x)')&lt;br /&gt;
	plt.axhline(0, color='black', linewidth=0.5)&lt;br /&gt;
	plt.axvline(0, color='black', linewidth=0.5)&lt;br /&gt;
	plt.grid(True, linestyle=':', alpha=0.6)&lt;br /&gt;
	plt.legend(['1/2','cos','sin'], loc = 'upper right', bbox_to_anchor = (1,1))&lt;br /&gt;
	plt.tight_layout()&lt;br /&gt;
&lt;br /&gt;
	# Mostrar resultado&lt;br /&gt;
	plt.show()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def serie_fourier_definitiva(f,L,n):&lt;br /&gt;
&lt;br /&gt;
	#Puntos donde se grafica y sus valores exactos&lt;br /&gt;
	x = np.linspace(-L/2,L/2,1000)&lt;br /&gt;
	f_ev = f(x)&lt;br /&gt;
&lt;br /&gt;
	def serie_fourier(funcion,x_val,n_terms):&lt;br /&gt;
		fn = np.zeros_like(x_val)&lt;br /&gt;
		f_eval = funcion(x_val)&lt;br /&gt;
&lt;br /&gt;
		c0 = trapezoid(2/L * f_eval,x_val)&lt;br /&gt;
		fn = c0/2&lt;br /&gt;
		for k in range(1,n_terms+1):&lt;br /&gt;
			#Coeficientes&lt;br /&gt;
			cn = trapezoid(2/L * f_eval * np.cos(2*k*np.pi*x_val/L),x_val)&lt;br /&gt;
			dn = trapezoid(2/L * f_eval * np.sin(2*k*np.pi*x_val/L),x_val)&lt;br /&gt;
&lt;br /&gt;
			#Sumar términos&lt;br /&gt;
			fn +=  cn* np.cos(2*k*np.pi*x_val/L) + dn * np.sin(2*k*np.pi*x_val/L)&lt;br /&gt;
&lt;br /&gt;
		return fn&lt;br /&gt;
&lt;br /&gt;
	#Gráfica&lt;br /&gt;
	plt.figure(figsize = (10,6))&lt;br /&gt;
	plt.plot(x,f_ev,'k--', label='f(x) original', linewidth=2)&lt;br /&gt;
&lt;br /&gt;
	for i in n:&lt;br /&gt;
		fn_ev = serie_fourier(f,x,i)&lt;br /&gt;
		plt.plot(x,fn_ev, label=f'n = {i}')&lt;br /&gt;
&lt;br /&gt;
	plt.title('Aproximación de f(x) mediante serie de Fourier')&lt;br /&gt;
	plt.legend()&lt;br /&gt;
	plt.grid(True, alpha=0.3)&lt;br /&gt;
	plt.show()&lt;br /&gt;
&lt;br /&gt;
	#Cálculo de errores&lt;br /&gt;
	n_error = []&lt;br /&gt;
	for i in range(1,100):&lt;br /&gt;
		n_error.append(i)&lt;br /&gt;
&lt;br /&gt;
	error_l2 = []&lt;br /&gt;
	error_inf = []&lt;br /&gt;
&lt;br /&gt;
	for i in n_error:&lt;br /&gt;
		f_n = serie_fourier(f,x,i)&lt;br /&gt;
		dif = f_ev - f_n&lt;br /&gt;
&lt;br /&gt;
		error_l2.append(np.sqrt(trapezoid(dif**2,x)))&lt;br /&gt;
		error_inf.append(round(float(np.max(np.abs(dif))),6))&lt;br /&gt;
&lt;br /&gt;
	#Gráfica&lt;br /&gt;
	plt.figure(figsize = (10,6))&lt;br /&gt;
	plt.plot(n_error,error_l2, linewidth=2)&lt;br /&gt;
	plt.title('Error $L^2$')&lt;br /&gt;
	plt.legend()&lt;br /&gt;
	plt.grid(True, alpha=0.3)&lt;br /&gt;
	plt.show()&lt;br /&gt;
&lt;br /&gt;
def comparar_fourier_cesaro(func, L, n_terms, nombre_funcion=&amp;quot;Función&amp;quot;):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    Calcula y grafica la aproximación de Fourier estándar vs Sumas de Cesàro.&lt;br /&gt;
    &lt;br /&gt;
    func: Función original a aproximar.&lt;br /&gt;
    L: Longitud del intervalo [-L/2, L/2].&lt;br /&gt;
    n_terms: Número máximo de coeficientes (n).&lt;br /&gt;
    &lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    def get_coefficients(n):&lt;br /&gt;
        # Integración por método del trapecio como se indica en el documento &lt;br /&gt;
        x_int = np.linspace(-L/2, L/2, 2000)&lt;br /&gt;
        y_int = func(x_int)&lt;br /&gt;
        &lt;br /&gt;
        # Coeficiente c0&lt;br /&gt;
        c0 = (2/L) * trapezoid(y_int, x_int)&lt;br /&gt;
        &lt;br /&gt;
        an = []&lt;br /&gt;
        bn = []&lt;br /&gt;
        for i in range(1, n + 1):&lt;br /&gt;
            cos_term = np.cos(2 * np.pi * i * x_int / L)&lt;br /&gt;
            sin_term = np.sin(2 * np.pi * i * x_int / L)&lt;br /&gt;
            an.append((2/L) * trapezoid(y_int * cos_term, x_int))&lt;br /&gt;
            bn.append((2/L) * trapezoid(y_int * sin_term, x_int))&lt;br /&gt;
        return c0, an, bn&lt;br /&gt;
&lt;br /&gt;
    # Obtener coeficientes&lt;br /&gt;
    c0, an, bn = get_coefficients(n_terms)&lt;br /&gt;
    &lt;br /&gt;
    # Construir sumas parciales S_k para Cesàro&lt;br /&gt;
    x_range = np.linspace(-L/2,L/2,1000)&lt;br /&gt;
    sumas_parciales = []&lt;br /&gt;
    current_sum = np.full_like(x_range, c0 / 2)&lt;br /&gt;
    sumas_parciales.append(current_sum.copy())&lt;br /&gt;
    &lt;br /&gt;
    for i in range(n_terms):&lt;br /&gt;
        term = an[i] * np.cos(2 * np.pi * (i+1) * x_range / L) + \&lt;br /&gt;
               bn[i] * np.sin(2 * np.pi * (i+1) * x_range / L)&lt;br /&gt;
        current_sum += term&lt;br /&gt;
        sumas_parciales.append(current_sum.copy())&lt;br /&gt;
    &lt;br /&gt;
    # Calcular Suma de Cesàro (Promedio de las sumas parciales)&lt;br /&gt;
    sigma_n = np.mean(sumas_parciales, axis=0)&lt;br /&gt;
    &lt;br /&gt;
    # Gráfica&lt;br /&gt;
    plt.figure(figsize=(12, 6))&lt;br /&gt;
    plt.plot(x_range, func(x_range), 'k--', label=f&amp;quot;Original: {nombre_funcion}&amp;quot;, alpha=0.6)&lt;br /&gt;
    plt.plot(x_range, current_sum, label=f&amp;quot;Fourier Estándar (n={n_terms})&amp;quot;, color='red', alpha=0.5)&lt;br /&gt;
    plt.plot(x_range, sigma_n, label=f&amp;quot;Suma de Cesàro (n={n_terms})&amp;quot;, color='blue', linewidth=2)&lt;br /&gt;
    &lt;br /&gt;
    plt.title(f&amp;quot;Aproximación de {nombre_funcion}: Fourier vs Cesàro&amp;quot;)&lt;br /&gt;
    plt.xlabel(&amp;quot;x&amp;quot;)&lt;br /&gt;
    plt.ylabel(&amp;quot;f(x)&amp;quot;)&lt;br /&gt;
    plt.grid(True, linestyle='--', alpha=0.7)&lt;br /&gt;
    plt.show()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#Lo que se ejecuta---------------------------------------------------------&lt;br /&gt;
base_trigonometrica(6)&lt;br /&gt;
&lt;br /&gt;
def f(x):&lt;br /&gt;
	lista = []&lt;br /&gt;
	for i in x:&lt;br /&gt;
		if i &amp;lt; 0:&lt;br /&gt;
			lista.append(0)&lt;br /&gt;
		else:&lt;br /&gt;
			lista.append(1)&lt;br /&gt;
	return np.array(lista)&lt;br /&gt;
&lt;br /&gt;
def MW(x):&lt;br /&gt;
	n = 200&lt;br /&gt;
	a = 1/2&lt;br /&gt;
	b = 13&lt;br /&gt;
&lt;br /&gt;
	suma = 0&lt;br /&gt;
	for i in range(n):&lt;br /&gt;
		suma += a**i * np.cos(b**i * np.pi*x)&lt;br /&gt;
&lt;br /&gt;
	return suma&lt;br /&gt;
&lt;br /&gt;
def g(x):&lt;br /&gt;
	return x**2&lt;br /&gt;
&lt;br /&gt;
serie_fourier_definitiva(f,10,[1,5,10,100])&lt;br /&gt;
comparar_fourier_cesaro(f, 10, 50, &amp;quot;Función Discontinua (Escalón)&amp;quot;)&lt;br /&gt;
comparar_fourier_cesaro(MW, 10, 100, &amp;quot;Monstruo de Weierstrass&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Categoría:EDP]]&lt;br /&gt;
[[Categoría:EDP25/26]]&lt;/div&gt;</summary>
		<author><name>Álvaro Moreno</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/wiki/Series_de_Fourier_(Grupo_CCE)</id>
		<title>Series de Fourier (Grupo CCE)</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/wiki/Series_de_Fourier_(Grupo_CCE)"/>
				<updated>2026-02-16T11:53:53Z</updated>
		
		<summary type="html">&lt;p&gt;Coloma de Lara: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ TrabajoED | Series de Fourier. Grupo CCE| [[:Categoría:EDP|EDP]]|[[:Categoría:EDP25/26|2025-26]] | Coloma de Lara&lt;br /&gt;
Carlos de Miguel  &lt;br /&gt;
&lt;br /&gt;
Elena Rodríguez }}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Seriesdefourier_grupoCCEposter.pdf]]&lt;br /&gt;
&lt;br /&gt;
== Visualizar la base trigométrica ==&lt;br /&gt;
Vamos a dibujar en una gráfica, con Matlab, los 7 primeros términos de la serie trigonométrica en &amp;lt;math&amp;gt; x\in [-1,1] &amp;lt;/math&amp;gt;, para que sea más fácil visualizarla.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%; border: none; background: transparent;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width: 65%; text-align: left; background: #f2f2f2;&amp;quot; | Implementación en MATLAB&lt;br /&gt;
! style=&amp;quot;width: 35%; text-align: center; background: #f2f2f2;&amp;quot; | Resultado Gráfico&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align: top;&amp;quot; |&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% definimos intervalo [-T, T]&lt;br /&gt;
T = 1;                  &lt;br /&gt;
x = linspace(-T, T, 1000); &lt;br /&gt;
n_max = 7;    %numero de terminos          &lt;br /&gt;
&lt;br /&gt;
% normalizamos&lt;br /&gt;
phi_0_factor = 1/sqrt(2*T);&lt;br /&gt;
phi_n_factor = 1/sqrt(T);&lt;br /&gt;
&lt;br /&gt;
figure('Color', 'w');&lt;br /&gt;
&lt;br /&gt;
%  d0 y dn (Cosenos - Pares)&lt;br /&gt;
subplot(2,1,1); hold on;&lt;br /&gt;
plot(x, ones(size(x)) * phi_0_factor, 'k', 'LineWidth', 2.5, 'DisplayName', 'd_0');&lt;br /&gt;
colors_d = lines(n_max);&lt;br /&gt;
for n = 1:n_max&lt;br /&gt;
    y_cos = phi_n_factor * cos(n * pi * x / T);&lt;br /&gt;
    plot(x, y_cos, 'Color', [colors_d(n,:), 0.5]);&lt;br /&gt;
end&lt;br /&gt;
title('Funciones de la base para d_0 y d_n (Pares)');&lt;br /&gt;
grid on; ylabel('Amplitud');&lt;br /&gt;
&lt;br /&gt;
%  cn (Senos - Impares)&lt;br /&gt;
subplot(2,1,2); hold on;&lt;br /&gt;
colors_c = jet(n_max);&lt;br /&gt;
for n = 1:n_max&lt;br /&gt;
    y_sin = phi_n_factor * sin(n * pi * x / T);&lt;br /&gt;
    plot(x, y_sin, 'Color', [colors_c(n,:), 0.5]);&lt;br /&gt;
end&lt;br /&gt;
title('Funciones de la base para c_n (Impares)');&lt;br /&gt;
grid on; xlabel('x'); ylabel('Amplitud');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| style=&amp;quot;vertical-align: middle; text-align: center;&amp;quot; |&lt;br /&gt;
[[Archivo:Basetrigo_n7_grupoCCE.png|450px|thumb|center|Visualización de la base ortonormal en [-1, 1].]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Aproximación de una función continua ==&lt;br /&gt;
&lt;br /&gt;
En este apartado, aproximamos la función continua &amp;lt;math&amp;gt;f(x) = 1 - 2|1/2 - x|&amp;lt;/math&amp;gt; en el intervalo &amp;lt;math&amp;gt;[0, 1]&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
=== Estudio de Convergencia según el número de términos===&lt;br /&gt;
Calculamos los coeficientes &amp;lt;math&amp;gt;a_k&amp;lt;/math&amp;gt; mediante la '''fórmula del trapecio''' con una división de &amp;lt;math&amp;gt;10^{-3}&amp;lt;/math&amp;gt;. Evaluamos el error en las normas &amp;lt;math&amp;gt;L^2&amp;lt;/math&amp;gt; y uniforme (&amp;lt;math&amp;gt;L^\infty&amp;lt;/math&amp;gt;) .&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%; border: none; background: transparent;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot; style=&amp;quot;text-align: left; background: #f2f2f2;&amp;quot; | Implementación en MATLAB&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;vertical-align: top;&amp;quot; |&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% Parámetros iniciales&lt;br /&gt;
dx = 1e-3; % división sugerida&lt;br /&gt;
x = 0:dx:1;&lt;br /&gt;
f = 1 - 2*abs(0.5 - x);&lt;br /&gt;
% Configuración de términos para visualización &lt;br /&gt;
valores_n = [1, 5, 10]; &lt;br /&gt;
figure(1);&lt;br /&gt;
plot(x, f, 'k--', 'LineWidth', 2); hold on;&lt;br /&gt;
% Bucle para calcular aproximaciones y errores &lt;br /&gt;
N_max = 50; &lt;br /&gt;
err_L2 = zeros(1, N_max);&lt;br /&gt;
err_inf = zeros(1, N_max);&lt;br /&gt;
&lt;br /&gt;
for n = 1:N_max&lt;br /&gt;
    fn = zeros(size(x));&lt;br /&gt;
    for k = 1:n&lt;br /&gt;
        % Cálculo de ak mediante trapecio&lt;br /&gt;
        integrando = 2 * f .* sin(k * pi * x);&lt;br /&gt;
        ak = trapz(x, integrando);&lt;br /&gt;
        &lt;br /&gt;
        % suma de los términos impares&lt;br /&gt;
        fn = fn + ak * sin(k * pi * x);&lt;br /&gt;
    end&lt;br /&gt;
    % guardar errores en normas L2 y uniforme &lt;br /&gt;
    err_L2(n) = sqrt(trapz(x, (f - fn).^2));&lt;br /&gt;
    err_inf(n) = max(abs(f - fn));&lt;br /&gt;
    &lt;br /&gt;
    if ismember(n, valores_n)&lt;br /&gt;
        plot(x, fn, 'DisplayName', ['n = ' num2str(n)]);&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
title('Aproximación de f(x) por Serie de Fourier (Senos)');&lt;br /&gt;
xlabel('x'); ylabel('f(x)');&lt;br /&gt;
legend('Original', 'n=1', 'n=5', 'n=10');&lt;br /&gt;
grid on;&lt;br /&gt;
&lt;br /&gt;
% gráfica de Errores &lt;br /&gt;
figure(2);&lt;br /&gt;
subplot(2,1,1);&lt;br /&gt;
plot(1:N_max, err_L2, 'bo-', 'LineWidth', 1.5);&lt;br /&gt;
title('Evolución del Error en Norma L^2');&lt;br /&gt;
xlabel('n (términos)'); ylabel('Error'); grid on;&lt;br /&gt;
&lt;br /&gt;
subplot(2,1,2);&lt;br /&gt;
plot(1:N_max, err_inf, 'ro-', 'LineWidth', 1.5);&lt;br /&gt;
title('Evolución del Error en Norma Uniforme');&lt;br /&gt;
xlabel('n (términos)'); ylabel('Error'); grid on;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width: 50%; text-align: center; background: #f2f2f2;&amp;quot; | Resultado de la Aproximación&lt;br /&gt;
! style=&amp;quot;width: 50%; text-align: center; background: #f2f2f2;&amp;quot; | Estudio de Convergencia&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | [[Archivo:Funcioncontinuaimagen_grupoCCE.png|400px|thumb|center|Visualización de aproximación de f(x) en [0,1]. ]]&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | [[Archivo:Errores_grupoCCE.png|400px|thumb|center|Errores graficados en norma L2 y uniforme.]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Estudio de la Convergencia según la regularidad===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%; border: none; background: transparent;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;3&amp;quot; style=&amp;quot;text-align: left; background: #f2f2f2;&amp;quot; | Implementación en MATLAB: Comparativa de Regularidad&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; style=&amp;quot;vertical-align: top;&amp;quot; |&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
% Parámetros iniciales&lt;br /&gt;
dx = 1e-3;&lt;br /&gt;
x = 0:dx:1;&lt;br /&gt;
N = 20; % Número de armónicos para la comparativa&lt;br /&gt;
&lt;br /&gt;
% Definición de las tres funciones&lt;br /&gt;
f1 = double(x &amp;lt; 0.5);          % 1. Función Salto (C^-1)&lt;br /&gt;
f2 = 1 - 2*abs(0.5 - x);       % 2. Función Triangular (C^0)&lt;br /&gt;
f3 = x.^2 - x;                 % 3. Parábola (C^inf)&lt;br /&gt;
&lt;br /&gt;
funciones = {f1, f2, f3};&lt;br /&gt;
titulos = {'Aproximación Función Salto', 'Aproximación Función f(x)', 'Aproximación Parábola'};&lt;br /&gt;
&lt;br /&gt;
for i = 1:3&lt;br /&gt;
    f_actual = funciones{i};&lt;br /&gt;
    figure(i);&lt;br /&gt;
    plot(x, f_actual, 'k--', 'LineWidth', 2); hold on;&lt;br /&gt;
    &lt;br /&gt;
    % Reconstrucción mediante Serie de Fourier (Base completa)&lt;br /&gt;
    L = 1;&lt;br /&gt;
    a0 = (2/L) * trapz(x, f_actual);&lt;br /&gt;
    fn = (a0/2) * ones(size(x));&lt;br /&gt;
    &lt;br /&gt;
    for k = 1:N&lt;br /&gt;
        ak = (2/L) * trapz(x, f_actual .* cos(2*pi*k*x/L));&lt;br /&gt;
        bk = (2/L) * trapz(x, f_actual .* sin(2*pi*k*x/L));&lt;br /&gt;
        fn = fn + ak*cos(2*pi*k*x/L) + bk*sin(2*pi*k*x/L);&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    plot(x, fn, 'r', 'LineWidth', 1.5);&lt;br /&gt;
    title(titulos{i});&lt;br /&gt;
    xlabel('x'); ylabel('f(x)');&lt;br /&gt;
    legend('Original', ['Serie Fourier (N=' num2str(N) ')']);&lt;br /&gt;
    grid on;&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width: 33%; text-align: center; background: #f2f2f2;&amp;quot; | 1. Función f(x) (Continua)&lt;br /&gt;
! style=&amp;quot;width: 33%; text-align: center; background: #f2f2f2;&amp;quot; | 2. Parábola (Suave)&lt;br /&gt;
! style=&amp;quot;width: 33%; text-align: center; background: #f2f2f2;&amp;quot; | 3. Función Salto (Discontinua)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | &lt;br /&gt;
[[Archivo:Triangular_grupoCCE.png|300px|thumb|center|Convergencia moderada sobre todo en el pico.]]&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | &lt;br /&gt;
[[Archivo:Parabola_grupoCCE.png|300px|thumb|center|Convergencia rápida.]]&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | &lt;br /&gt;
[[Archivo:Salto_grupoCCE.png|300px|thumb|center|]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%; border: none; background: transparent;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width: 65%; text-align: left; background: #f2f2f2;&amp;quot; | Implementación en MATLAB&lt;br /&gt;
! style=&amp;quot;width: 35%; text-align: center; background: #f2f2f2;&amp;quot; | Resultado Gráfico&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align: top;&amp;quot; |&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
dx = 1e-3;&lt;br /&gt;
x = 0:dx:1;&lt;br /&gt;
N_max = 50;&lt;br /&gt;
f1 = double(x &amp;lt; 0.5);         &lt;br /&gt;
f2 = 1 - 2*abs(0.5 - x);      &lt;br /&gt;
f3 = x.^2 - x;                &lt;br /&gt;
funciones = {f1, f2, f3};&lt;br /&gt;
colores = {'b', 'r', 'g'};&lt;br /&gt;
nombres = {'Salto', 'Triangular f(x)', 'Parábola'};&lt;br /&gt;
&lt;br /&gt;
figure(1); &lt;br /&gt;
hold on;&lt;br /&gt;
&lt;br /&gt;
for i = 1:3&lt;br /&gt;
    f_target = funciones{i};&lt;br /&gt;
    err_L2 = zeros(1, N_max);&lt;br /&gt;
    for n = 1:N_max&lt;br /&gt;
        a0 = 2 * trapz(x, f_target);&lt;br /&gt;
        fn = (a0/2) * ones(size(x));&lt;br /&gt;
        for k = 1:n&lt;br /&gt;
            ak = 2 * trapz(x, f_target .* cos(2*pi*k*x));&lt;br /&gt;
            bk = 2 * trapz(x, f_target .* sin(2*pi*k*x));&lt;br /&gt;
            fn = fn + ak*cos(2*pi*k*x) + bk*sin(2*pi*k*x);&lt;br /&gt;
        end&lt;br /&gt;
        % cálculo del error &lt;br /&gt;
        err_L2(n) = sqrt(trapz(x, (f_target - fn).^2));&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    plot(1:N_max, err_L2, 'Color', colores{i}, 'LineWidth', 2, 'DisplayName', nombres{i});&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
set(gca, 'YScale', 'log'); % escala logarítmica para ver mejor las diferencias&lt;br /&gt;
title('Evolución del Error Residual (Norma L^2)');&lt;br /&gt;
xlabel('Número de terminos (N)'); ylabel('Error (log)');&lt;br /&gt;
legend('show'); grid on;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| style=&amp;quot;vertical-align: middle; text-align: center;&amp;quot; |&lt;br /&gt;
[[Archivo:Erroresfunciones_grupoCCE.png|450px|thumb|center|Error de cada función.]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; width: 100%;&amp;quot;&lt;br /&gt;
|+ Coeficientes de Fourier bn&lt;br /&gt;
! n !! Función Salto  !! Función Triangular !! Parábola x^2-x&lt;br /&gt;
|-&lt;br /&gt;
| '''1''' || 1.2732 || 0.8106 || -0.2580&lt;br /&gt;
|-&lt;br /&gt;
| '''3''' || 0.4244 || -0.0901 || -0.0096&lt;br /&gt;
|-&lt;br /&gt;
| '''5''' || 0.2546 || 0.0324 || -0.0021&lt;br /&gt;
|-&lt;br /&gt;
| '''7''' || 0.1819 || -0.0165 || -0.0008&lt;br /&gt;
|-&lt;br /&gt;
| '''9''' || 0.1415 || 0.0100 || -0.0004&lt;br /&gt;
|-&lt;br /&gt;
| '''11''' || 0.1157 || -0.0067 || -0.0002&lt;br /&gt;
|-&lt;br /&gt;
| '''13''' || 0.0979 || 0.0048 || -0.0001&lt;br /&gt;
|-&lt;br /&gt;
| '''15''' || 0.0849 || -0.0036 || -0.0001&lt;br /&gt;
|-&lt;br /&gt;
! Decaimiento !! '''1/n'''  !! '''1/n²'''  !! '''1/n³''' &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Categoría:EDP]]&lt;br /&gt;
[[Categoría:EDP25/26]]&lt;/div&gt;</summary>
		<author><name>Coloma de Lara</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/wiki/Series_de_Fourier</id>
		<title>Series de Fourier</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/wiki/Series_de_Fourier"/>
				<updated>2026-02-15T18:14:23Z</updated>
		
		<summary type="html">&lt;p&gt;Sofía: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ TrabajoED | Series de Fourier. Grupo 6-A | [[:Categoría:EDP|EDP]]|[[:Categoría:EDP25/26|2025-26]] | Leire Aparicio Urbiola&lt;br /&gt;
&lt;br /&gt;
Álvaro Silva Blanco &lt;br /&gt;
&lt;br /&gt;
Julia Calado Bonnin&lt;br /&gt;
&lt;br /&gt;
Sofía García Suárez&lt;br /&gt;
&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Categoría:EDP]]&lt;br /&gt;
[[Categoría:EDP25/26]]&lt;br /&gt;
&lt;br /&gt;
== Póster ==&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Poster_LAJS.png||900px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Poster_LAJS.pdf]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Introducción ==&lt;br /&gt;
La manera más común de representar la serie de Fourier de una función &amp;lt;math&amp;gt;f(x) &amp;lt;/math&amp;gt; es mediante&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math display=&amp;quot;block&amp;quot;&amp;gt;&lt;br /&gt;
  f(x) \sim\frac{a_0}{2 \pi} + \sum_{n=1}^{N} \left( a_n \frac{1}{\sqrt{\pi}} \cos(n x) + b_n \frac{1}{\sqrt{\pi}} \sin (n x)\right)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
siendo &amp;lt;math&amp;gt; a_0,a_n,b_n &amp;lt;/math&amp;gt; los coeficientes de Fourier, que se calculan mediante las integrales:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math display=&amp;quot;block&amp;quot;&amp;gt;&lt;br /&gt;
a_0 = \int_{-\pi}^{\pi} \frac{1}{\sqrt{\pi}} f(x) dx \quad a_n = \int_{-\pi}^{\pi} \frac{1}{\sqrt{\pi}} \cos(n x) f(x) dx \quad b_n = \int_{-\pi}^{\pi} \frac{1}{\sqrt{\pi}} \sin(n x) f(x) dx&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es decir, la función &amp;lt;math&amp;gt;f(x) &amp;lt;/math&amp;gt; se expresa como una combinación lineal de funciones seno y coseno con coeficientes constantes. Sin embargo, en algunos contextos reales, como la modelización de fenómenos naturales, no es razonable suponer que dichos coeficientes son conocidos de forma exacta. En algunos casos, la información que conocemos sobre el sistema puede ser intrínsecamente aleatoria, lo que motiva la introducción de modelos probabilísticos. Una forma natural de incorporar esta aleatoriedad consiste en sustituir los coeficientes de Fourier que conocemos por variables aleatorias. Este planteamiento permite definir funciones aleatorias cuyos valores, aun conservando una estructura armónica, presentan fluctuaciones controladas en función de la distribución estadística de los coeficientes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Modelo matemático ==&lt;br /&gt;
&lt;br /&gt;
Comenzamos definiendo la ecuación general que utilizaremos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math display=&amp;quot;block&amp;quot;&amp;gt;&lt;br /&gt;
f_{\sigma}(x) = \frac{a_0}{2} + \sum_{n=1}^{N} \left( a_n \cos(n\pi x) + b_n \sin(n\pi x) \right)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
donde los coeficientes &amp;lt;math&amp;gt; a_n &amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt; b_n &amp;lt;/math&amp;gt; serán variables aleatorias independientes e idénticamente distribuidas que se generarán a partir de distribuciones de probabilidad en lugar de calcularlos mediante integrales. Estudiaremos dos escenarios diferentes:&lt;br /&gt;
&lt;br /&gt;
* '''Distribución uniforme:''' los coeficientes seguirán una distribución uniforme en el intervalo &amp;lt;math&amp;gt; [-c,c] &amp;lt;/math&amp;gt;, es decir, &amp;lt;math&amp;gt;a_n, b_n \sim \operatorname{U}(-c, c) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''Distribución normal:''' los coeficientes seguirán una distribución normal de media 0 y varianza &amp;lt;math&amp;gt;\sigma^2&amp;lt;/math&amp;gt; , &amp;lt;math&amp;gt; a_n, b_n \sim \mathcal{N}(0, \sigma^2) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Cálculo de la esperanza, varianza y covarianza ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===  Cálculo de la esperanza &amp;lt;math&amp;gt;E[f_\sigma(x)]&amp;lt;/math&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
En los casos que hemos considerado, o bien &amp;lt;math&amp;gt;a_n, b_n \sim \operatorname{U}(-c, c) &amp;lt;/math&amp;gt;, por lo que &amp;lt;math&amp;gt; E[a_n]=E[b_n] = \frac{-a+a}{2}=0 &amp;lt;/math&amp;gt;, o bien &amp;lt;math&amp;gt; a_n, b_n \sim \mathcal{N}(0, \sigma^2) &amp;lt;/math&amp;gt;, entonces &amp;lt;math&amp;gt; E[a_n]=E[b_n] =0 &amp;lt;/math&amp;gt;. Por lo tanto la esperanza se calcula:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;E[f_\sigma(x)] = \sum_{n=0}^{N} [E[a_n] \cos(nx) + E[b_n] \sin(nx)] = 0 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es decir, la esperanza es 0 para todo &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, siempre que &amp;lt;math&amp;gt;a_n, b_n&amp;lt;/math&amp;gt; sean variables aleatorias independientes e idénticamente distribuidas centradas en la media 0.&lt;br /&gt;
&lt;br /&gt;
===  Cálculo de la varianza &amp;lt;math&amp;gt;V(f_\sigma(x))&amp;lt;/math&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
Utilizamos la definición de varianza &amp;lt;math&amp;gt;V(f_\sigma(x)) = E[f_\sigma(x)^2] - E[f_\sigma(x)]^2 &amp;lt;/math&amp;gt; y utilizamos el resultado del apartado anterior, &amp;lt;math&amp;gt;E[f] =0&amp;lt;/math&amp;gt;, luego &amp;lt;math&amp;gt;V(f_\sigma(x)) = E[f_\sigma(x)^2]&amp;lt;/math&amp;gt;, y teniendo en cuenta que&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;f_\sigma(x)^2 = \sum_{n,m} [a_n a_m \cos(nx) \cos(mx) + b_n b_m \sin(nx) \sin(mx) + 2 a_n b_m \cos(nx) \sin(mx)]&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tomando esperanza y usando independencia y que la media de &amp;lt;math&amp;gt;a_n, b_n&amp;lt;/math&amp;gt; es cero, &lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;E[a_n a_m] = 0&amp;lt;/math&amp;gt; si &amp;lt;math&amp;gt;n \neq m&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;= \sigma_{a_n}^2&amp;lt;/math&amp;gt; si &amp;lt;math&amp;gt;n = m&amp;lt;/math&amp;gt; e igual para &amp;lt;math&amp;gt;b_n b_m&amp;lt;/math&amp;gt;.&lt;br /&gt;
*&amp;lt;math&amp;gt;E[a_n b_m] = 0&amp;lt;/math&amp;gt; para todo &amp;lt;math&amp;gt;n, m&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Entonces&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;V(f_\sigma(x)) = \sum_{n=0}^{N} [\sigma_{a_n}^2 \cos^2(nx) + \sigma_{b_n}^2 \sin^2(nx)]&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si tomamos &amp;lt;math&amp;gt;\sigma_{a_n}^2 = \sigma_{b_n}^2 = \sigma_n^2&amp;lt;/math&amp;gt; (misma varianza para seno y coseno):&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;V(f_\sigma(x)) = \sum_{n=0}^{N} \sigma_n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
independiente de &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===  Cálculo de la covarianza &amp;lt;math&amp;gt;Cov(f_\sigma(x),f_\sigma(y))&amp;lt;/math&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
Calculamos la covarianza de dos funciones &amp;lt;math&amp;gt;f_\sigma(x),f_\sigma(y)&amp;lt;/math&amp;gt; utilizando la definición &amp;lt;math&amp;gt;Cov(f(x), f(y)) = E[f(x)f(y)] - E[f(x)]E[f(y)]&amp;lt;/math&amp;gt;. Ya hemos probado que &amp;lt;math&amp;gt;E[f_\sigma(x)] = 0&amp;lt;/math&amp;gt;, por tanto basta calcular el primer término.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt; E[f(x)f(y)] = \sum_{n=1}^{\infty} \sigma_n^2 \left[ \cos(n\pi x)\cos(n\pi y) + \sin(n\pi x)\sin(n\pi y) \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Y aplicando la identidad trigonométrica &amp;lt;math&amp;gt; \cos(A)\cos(B) + \sin(A)\sin(B) = \cos(A - B) &amp;lt;/math&amp;gt; se llega a &lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt; Cov(f(x), f(y)) = \sum_{n=1}^{\infty} \sigma_n^2 \cos(n \pi (x - y)) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hay un resultado que debemos destacar de la covarianza: su valor no depende de los puntos &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; por separado, sino de la distancia entre ambos, que en la fórmula que hemos calculado aparece como &amp;lt;math&amp;gt;(x-y)&amp;lt;/math&amp;gt;. Vamos a representar en Matlab el mapa de calor de la covarianza para visualizar el resultado al que hemos llegado.&lt;br /&gt;
&lt;br /&gt;
{{matlab|codigo=&lt;br /&gt;
% Dominio&lt;br /&gt;
Nx = 1000;&lt;br /&gt;
x = linspace(0,1,Nx);&lt;br /&gt;
y = linspace(0,1,Nx);&lt;br /&gt;
&lt;br /&gt;
% Malla (x,y)&lt;br /&gt;
[X,Y] = meshgrid(x,y);&lt;br /&gt;
&lt;br /&gt;
% Parámetros&lt;br /&gt;
N = 10;           % número de modos&lt;br /&gt;
Cov = zeros(Nx);  % matriz de covarianza&lt;br /&gt;
&lt;br /&gt;
% Cálculo de la covarianza&lt;br /&gt;
for n = 1:N&lt;br /&gt;
    Cov = Cov + cos(n*pi*(X - Y));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% Mapa de calor&lt;br /&gt;
figure&lt;br /&gt;
imagesc(x,y,Cov)&lt;br /&gt;
axis xy&lt;br /&gt;
colorbar&lt;br /&gt;
xlabel('x')&lt;br /&gt;
ylabel('y')&lt;br /&gt;
title('Mapa de calor de la covarianza Cov(f(x), f(y))')&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
covarianza.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Cuestiones probabilísticas ==&lt;br /&gt;
&lt;br /&gt;
Pasamos ahora a responder algunas cuestiones probabilísticas que nos ayuden a estudiar la función aleatoria &amp;lt;math&amp;gt;f_\sigma (x)&amp;lt;/math&amp;gt;. Por ejemplo, ¿es cierto que,  fijado un punto la función tiene la misma probabilidad de ser positiva que negativa? En los casos que hemos considerado, en los que los coeficientes &amp;lt;math&amp;gt;a_n&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b_n&amp;lt;/math&amp;gt; son variables aleatorias que siguen o bien una distribución normal o bien una distribución uniforme con media cero (demostrado anteriormente). Por lo tanto, en el caso de la distribución normal, dado que la función &amp;lt;math&amp;gt;f_\sigma (x)&amp;lt;/math&amp;gt; es suma de variables aleatorias que siguen una distribución &amp;lt;math&amp;gt; N(0,\sigma^2)&amp;lt;/math&amp;gt; y la suma de variables normales siempre es normal, podemos afirmar que &amp;lt;math&amp;gt;f_\sigma (x) \sim N(0,\sigma^2)&amp;lt;/math&amp;gt; y por lo tanto la probabilidad de que la función sea positiva o negativa en cualquier punto será 50/50. Por otro lado, en el caso en que las variables &amp;lt;math&amp;gt;a_n&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b_n&amp;lt;/math&amp;gt; sigan una distribución uniforme, por el teorema central del límite sabemos que la suma de todas ellas convergerá a una distribución normal, luego la probabilidad de que &amp;lt;math&amp;gt;f_\sigma (x)&amp;lt;/math&amp;gt; sea positiva o negativa vuelve a ser 50/50. Para comprobar esto empíricamente, realizamos en Matlab una simulación que nos ayude a visualizar este fenómeno. Para ello generaremos una cantidad considerable de funciones &amp;lt;math&amp;gt;f_\sigma (x)&amp;lt;/math&amp;gt; con coeficientes que sigan la distribución que queramos. A continuación aparece el código desarrollado:&lt;br /&gt;
&lt;br /&gt;
{{matlab|codigo=&lt;br /&gt;
% CONFIGURACIÓN INICIAL&lt;br /&gt;
L = 1;   &lt;br /&gt;
N = 20;             % num de términos de la serie de Fourier &lt;br /&gt;
M = 20;             % num de funciones aleatorias distintas a generar&lt;br /&gt;
num_puntos = 500;&lt;br /&gt;
&lt;br /&gt;
x = linspace(-L, L, num_puntos);&lt;br /&gt;
F_sigma = zeros(M, num_puntos);&lt;br /&gt;
&lt;br /&gt;
% GENERACIÓN DE COEFICIENTES Y FUNCIONES&lt;br /&gt;
distribucion = 'normal'; % Opciones: 'normal' o 'uniforme'&lt;br /&gt;
&lt;br /&gt;
fprintf('Generando %d funciones aleatorias...\n', M);&lt;br /&gt;
&lt;br /&gt;
for n = 1:N&lt;br /&gt;
    % 1. Generar coeficientes aleatorios para este armónico n&lt;br /&gt;
    if strcmp(distribucion, 'normal')&lt;br /&gt;
        % Distribución Normal Estándar N(0,1)&lt;br /&gt;
        an = randn(M, 1); &lt;br /&gt;
        bn = randn(M, 1);&lt;br /&gt;
    else&lt;br /&gt;
        % Distribución Uniforme en [-1, 1]&lt;br /&gt;
        an = 2*rand(M, 1) - 1; &lt;br /&gt;
        bn = 2*rand(M, 1) - 1;&lt;br /&gt;
    end&lt;br /&gt;
   &lt;br /&gt;
    term_cos = an * cos(n * pi * x / L);&lt;br /&gt;
    term_sin = bn * sin(n * pi * x / L);&lt;br /&gt;
    &lt;br /&gt;
    F_sigma = F_sigma + term_cos + term_sin;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
% VISUALIZACIÓN&lt;br /&gt;
figure('Name', 'Conjunto de Funciones Aleatorias', 'Color', 'w');&lt;br /&gt;
hold on; grid on;&lt;br /&gt;
&lt;br /&gt;
% Graficamos las primeras 20 funciones&lt;br /&gt;
plot(x, F_sigma(1:20, :), 'LineWidth', 0.5, 'Color', [0, 0.4470, 0.7410, 0.3]);&lt;br /&gt;
&lt;br /&gt;
% Graficamos la media empírica en negro y grueso&lt;br /&gt;
media_em = mean(F_sigma, 1);&lt;br /&gt;
plot(x, media_em, 'k-', 'LineWidth', 3, 'DisplayName', 'Esperanza E[f(x)]');&lt;br /&gt;
&lt;br /&gt;
xlabel('x'); ylabel('f_{\sigma}(x)');&lt;br /&gt;
title(['Funciones Aleatorias de Fourier (Distribución: ' distribucion ')']);&lt;br /&gt;
xlim([-L, L]);&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Prob.png|&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;/div&gt;</summary>
		<author><name>Leire Aparicio</name></author>	</entry>

	</feed>