Metadata-Version: 2.4
Name: analisis_numerico
Version: 0.1.0
Summary: Libreria de Python para analisis numerico
Author: Alejo012G
License: MIT
Keywords: numerical analysis,python,math
Classifier: Development Status :: 3 - Alpha
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: MIT License
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3 :: Only
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Operating System :: OS Independent
Requires-Python: >=3.10
Description-Content-Type: text/markdown
Provides-Extra: dev
Requires-Dist: pytest>=8; extra == "dev"

# analisis_numerico
![Python](https://img.shields.io/badge/python-3.8%2B-blue) ![Stability](https://img.shields.io/badge/stability-stable-green)

`analisis_numerico` es una libreria enfocada en interpolacion polinomica en Python (de momento). Provee implementaciones claras de Newton y Lagrange, formateo de polinomios parciales y utilidades para trabajar con tablas de nodos.

La libreria no depende de paquetes externos y funciona con Python 3.8 o superior.

## Instalacion

```bash
pip install analisis_numerico
```

## Documentacion de API detallada

### `Newton(function, table)`

Interpolacion por diferencias divididas finitas.

**Formato de `table`**
- La `table` es un iterable de filas con alguno de estos formatos:
    - `x_k`
    - `(x_k, y_k)`
    - `(k, x_k, y_k)`
- Si se pasa solo `x_k`, el valor `y_k` se calcula como `function(x_k)`.
- Los valores `x_k` deben ser numericos y no repetirse.

**Metodos**
- `dif_dividas() -> dict`
    - Devuelve un diccionario ordenado con claves tipo `f[x_0]`, `f[x_0,x_1]`, etc.
- `interpolador(position: int | None = None)`
    - Si `position=None`, devuelve la lista completa `[p_0, ..., p_n]`.
    - Si `position=int`, devuelve solo `p_position` como funcion.
- `evaluar(p_i: int, x: float) -> float | dict`
    - Si `p_i == -1`, devuelve un diccionario con todas las evaluaciones `p_i(x)`.
    - Si `p_i >= 0`, devuelve el valor de `p_i(x)`.
- `formatear(position: int | None = None, operar: bool = True, precision: int = 6) -> str`
    - `operar=True` devuelve la forma expandida en potencias de `x`.
    - `operar=False` devuelve la forma de Newton sin expandir.

**Errores**
- `TypeError` si `function` no es callable.
- `TypeError` si la `table` no es iterable o contiene filas invalidas.
- `TypeError` si `x_k` o `y_k` no son numericos.
- `ValueError` si la tabla esta vacia.
- `ValueError` si hay `x_k` repetidos.
- `TypeError` si `position` o `p_i` no son enteros.
- `ValueError` si `position` o `p_i` estan fuera de rango.

### `Lagrange(function, table)`

Interpolacion polinomica usando la base de Lagrange.

**Formato de `table`**
- La `table` admite los mismos formatos que `Newton`:
    - `x_k`
    - `(x_k, y_k)`
    - `(k, x_k, y_k)`
- Si se omite `y_k`, se evalua `function(x_k)`.
- Los `x_k` deben ser numericos y unicos.

**Metodos**
- `interpolador(position: int | None = None)`
    - Devuelve `p_position` como funcion o la lista completa de parciales.
- `evaluar(p_i: int, x: float) -> float | dict`
    - Mismo contrato que `Newton.evaluar`.
- `formatear(position: int | None = None, operar: bool = True, precision: int = 6) -> str`
    - `operar=True` devuelve forma expandida.
    - `operar=False` devuelve forma numerica de Lagrange.

**Errores**
- `TypeError` si `function` no es callable.
- `TypeError` si la `table` no es iterable o contiene filas invalidas.
- `TypeError` si `x_k` o `y_k` no son numericos.
- `ValueError` si la tabla esta vacia.
- `ValueError` si hay `x_k` repetidos.
- `TypeError` si `position` o `p_i` no son enteros.
- `ValueError` si `position` o `p_i` estan fuera de rango.

