```python
from sympy import *
from sympy.solvers.solveset import solveset
init_printing()
x, y, z = symbols('x,y,z')
```

## Solveset

La resolución de ecuaciones es una necesidad común y también un elemento común para algoritmos simbólicos más complicados.

Aquí presentamos la función `solveset`.


```python
solveset(x**2 - 4, x)
```

*Solveset* toma dos argumentos y un argumento opcional que especifica el dominio, una ecuación como $x^2 - 4$ y una variable sobre la cual queremos resolver, como $x$ y un argumento opcional *domain* que especifica la región en la que queremos resolver .

*Solveset* devuelve los valores de la variable, $x$, para los cuales la ecuación, $x^2 - 4$ es igual a 0.

### Ejercicio

¿Qué produciría el siguiente código? ¿Estás seguro?


```python
solveset(x**2 - 9 == 0, x)
```

## Soluciones infinitas

Una de las principales mejoras de `solveset` es que también admite una solución infinita.


```python
solveset(sin(x), x)
```

## Argumento *domain*


```python
solveset(exp(x) -1, x)
```

`solveset` por defecto resuelve todo en el dominio complejo. En el dominio complejo $\exp(x) = \cos(x) + i\sin(x)$ y la solución es básicamente igual a la solución de $\cos(x) = 1$. Si solo desea una solución real, puede especificar el dominio como `S.Reals`.


```python
solveset(exp(x) -1, x, domain=S.Reals)
```

`solveset` no siempre es capaz de resolver una ecuación dada, en tales casos devuelve un objeto` ConditionSet`. `ConditionSet` representa un conjunto que satisface una condición dada.


```python
solveset(exp(x) + cos(x) + 1, x, domain=S.Reals)
```

`solveset` tiene como objetivo devolver todas las soluciones de la ecuación. En los casos en que puede encontrar alguna solución pero no todas, devuelve una unión de las soluciones conocidas y `ConditionSet`.


```python
solveset((x - 1)*(exp(x) + cos(x) + 1), x, domain=S.Reals)
```

## Uso simbólico de `solveset`

Los resultados de `solveset` no necesitan ser numéricos, como `{-2, 2}`. Podemos usar solveset para realizar manipulaciones algebraicas. Por ejemplo, si conocemos una ecuación simple para el área de un rectángulo

    area = largo * ancho

podemos resolver esta ecuación para cualquiera de las variables. Por ejemplo, ¿cómo resolveríamos este sistema para `largo`, dado `area` y `ancho`?


```python
largo, ancho, area = symbols('largo, ancho, area')
solveset(area - largo*ancho, largo)
```

Ten en cuenta que nos hubiera gustado escribir

    solveset(area == largo * ancho, largo)

Pero el *gotcha* `==` nos muerde. En cambio, recordamos que `solveset` espera una expresión que sea igual a cero, por lo que reescribimos la ecuación

    area = largo * ancho

en la ecuación

    0 = largo * ancho - area

y eso es lo que le damos a `solveset`.

### Ejercicio

Calcula el radio de una esfera, dado el volumen. Recuerde, el volumen de una esfera de radio `r` está dado por

$$ V = \frac{4}{3}\pi r^3 $$


```python
# Resuelve para el radio de una esfera, dado el volumen
```

Probablemente obtendrás varias soluciones, eso está bien. La primera es probablemente la que quieres.

## Sustitución

A menudo queremos sustituir en una expresión por otra. Para esto, usamos el método de `subs`


```python
x**2
```


```python
# Sustituye x por y
(x**2).subs({x: y})
```

### Ejercicio

Sustituye $x$ por $\sin(x)$ en la ecuación $x^2 + 2\cdot x + 1$


```python
# Sustituye x por sin(x)


```

## Subs + Solveset

Podemos usar `subs` y `solveset` juntos para conectar la solución de una ecuación a otra


```python
# Resuelve para el largo de un rectangulo dada el area y el ancho

soln = list(solveset(area - largo*ancho, largo))[0]
soln
```


```python
# Define el perimetro de un rectangulo en terminos del largo y ancho 

perimetro = 2*(largo + ancho)
```


```python
# Sustituye la solucion para el largo en la expresion para el perimetro

perimetro.subs({largo: soln})
```

### Ejercicio

En la última sección resolviste para el radio de una esfera dado su volumen


```python
V, r = symbols('V,r', positive=True)
4*pi/3 * r**3
```


```python
list(solveset(V - 4*pi/3 * r**3, r))[0]
```

Ahora vamos a calcular el área de una esfera en términos del volumen. Recuerde que el área de una esfera está dada por

$$ 4 \pi r^2 $$


```python
(?).subs(?)
```

¿La expresión se ve bien? ¿Cómo esperas que el área escale con respecto al volumen? ¿Cuál es el exponente en $V$?

## Trazado de gráficas

*Sympy* puede graficar expresiones fácilmente usando la función `plot`. Para esto, la biblioteca por defecto es  *matplotlib*.


```python
import matplotlib.pyplot as plt
```


```python
plot(x**2)
```

### Ejercicio

En el último ejercicio, obtuviste una relación entre el volumen de una esfera y su área. Grafica esta relación usando `plot`.


```python
plot(?)
```

## Mínimas dependencias

*SymPy* intenta ser un proyecto con pocas dependencia. Nuestra base de usuarios es muy amplia. Algunos aspectos entretenidos resultan. Por ejemplo, `textplot`.


```python
textplot(x**2, -3, 3)
```

### Ejercicio

Juega con `textplot` y disfruta :)

2ac37e5fd3c3fad4ef18fbc0e4ad54f87b54288e
ipynb
Jupyter Notebook
tutorial_exercises/02-Solveset-Subs-Plot.ipynb
t3rodrig/sympy-tutorial-es
5cd5497f799e889d758a26539781cdc72b1e6a74
BSD-3-Clause
tutorial_exercises/02-Solveset-Subs-Plot.ipynb
t3rodrig/sympy-tutorial-es
5cd5497f799e889d758a26539781cdc72b1e6a74
BSD-3-Clause
tutorial_exercises/02-Solveset-Subs-Plot.ipynb
t3rodrig/sympy-tutorial-es
5cd5497f799e889d758a26539781cdc72b1e6a74
BSD-3-Clause
Qwen/Qwen-72B
1. YES
2. YES