Contact
CoCalc Logo Icon
StoreFeaturesDocsShareSupport News AboutSign UpSign In
| Download
Views: 91
%auto typeset_mode(True, display=False)

Introdução ao Uso do Sage para Modelagem Matemática

Flávio Codeço Coelho -- Escola de Matemática Aplicada -- Fundação Getulio Vargas

Nesta planilha  iremos apresentar allguma características básicas do Sage, com especial atenção ao uso para modelagem matemática. Vários dos exemplos mostrados aqui foram retirados do tutorial do Sage. Para um maior aprofundamento, recomendo a sua leitura.

Linguagem de programação(s)

A linguagem básica para programação no Sage é o Python. Entretanto, é possível misturar linguagens em uma mesma planilha, bastando para isso que a linguagem seja declarada no começo de uma célula (p. ex. %R, %matlab, %octave, etc). Em princípio não iremos explorar outras linguagens, mas pode ser que usemos este recurso em algum exemplo específico. Este tutorial também assume que o leitor tenha conhecimentos básicos de Python. Apenas introduziremos aspectos da linguagem do Sage onde houver construções sintáticas não compatíveis com o Python, como por exemplo:

3^2 == 3**2 # Isto não é verdadeiro em Python!
True\mathrm{True}
%r n <- rnorm(1000, mean=0, sd=1) png(file="myplot.png", bg="transparent",type="cairo") hist(n)
%octave x=1:10 x
warning: using the gnuplot graphics toolkit is discouraged The gnuplot graphics toolkit is not actively maintained and has a number of limitations that are unlikely to be fixed. Communication with gnuplot uses a one-directional pipe and limited information is passed back to the Octave interpreter so most changes made interactively in the plot window will not be reflected in the graphics properties managed by Octave. For example, if the plot window is closed with a mouse click, Octave will not be notified and will not update its internal list of open figure windows. The qt toolkit is recommended instead. x = 1 2 3 4 5 6 7 8 9 10 x = 1 2 3 4 5 6 7 8 9 10
%octave plot(x)

A divisão também é um pouco diferente no Sage:

5/2
52\frac{5}{2}

O Sage procura retornar expressões exatas sempre que possível.

sin(pi/3)
123\frac{1}{2} \, \sqrt{3}

Para aproximações numéricas use a função n(<expr>).

n(_)
0.8660254037844390.866025403784439

O caracter "_", também representa o resultado da última célula.

sin(10).n(digits=5)
0.54402-0.54402
pi.n(prec=200)
3.14159265358979323846264338327950288419716939937510582097493.1415926535897932384626433832795028841971693993751058209749

O Sage também introduz tipos extendidos, por exemplo:

a = 5/3 # Agora a é um número racional type(a)
<class 'sage.rings.rational.Rational'>

Álgebra e Cálculo

O ponto forte to Sage é a computação simbólica. Vamos ver alguns exemplos.

Manipulando Expressões Simbólicas

Vamos construir uma expressão simples:

z = (x+1)^3 z
(x+1)3{\left(x + 1\right)}^{3}

Note que a construção acima é possivel pois  o Sage considera o símbolo "x" como uma variável simbólica por default:

type(x)
<class 'sage.symbolic.expression.Expression'>

Vamos expandir este binômio

expand(z)
x3+3x2+3x+1x^{3} + 3 \, x^{2} + 3 \, x + 1

Agora façamos o caminho de volta:

factor(expand(z))
(x+1)3{\left(x + 1\right)}^{3}

O sage também nos permite fazer matemática de forma mais interativa:

y = var('y') # Definindo y como uma variável simbólica também @interact def binomios(n=(2,9,1)): # n varia de 2 a 9 em intervalos de 1 z = (x+y)^n show(expand(z))
Interact: please open in CoCalc

Vamos brincar com algo um pouquinho mais complexo:

z = ((x - 1)^(3/2) - (x + 1)*sqrt(x - 1))/sqrt((x - 1)*(x + 1)) z
(x+1)x1(x1)32(x+1)(x1)-\frac{{\left(x + 1\right)} \sqrt{x - 1} - {\left(x - 1\right)}^{\frac{3}{2}}}{\sqrt{{\left(x + 1\right)} {\left(x - 1\right)}}}
/script> }}}

Podemos simplificar a expressão completamente:

z.simplify_full()
2x1x21-\frac{2 \, \sqrt{x - 1}}{\sqrt{x^{2} - 1}}

Ou podemos simplificar apenas as frações, combinando-as:

z.simplify_rational()
2x1x21-\frac{2 \, \sqrt{x - 1}}{\sqrt{x^{2} - 1}}

Resolvendo Equações

Para  fazer operações com símbolos, é sempre necessário informar ao sage que variáveis devem ser tratadas como símbolos ao invés de variáveis comuns. O símbolo xx é tratado como variável simbólica, por padrão, a menos que lhe seja atribuído um valor.

solve(x^2==-1,x)
[x=(i)x = \left(-i\right), x=ix = i]
solve(x^2 + 3*x + 2, x)
[x=(2)x = \left(-2\right), x=(1)x = \left(-1\right)]

Vários símbolos podem ser declarados simultâneamente. Isto é útil quando desejamos resolver uma equação sem especificar os coeficientes.

a, b, c = var('a b c') solve([a*x^2 + b*x + c == 0],x)
[x=b+b24ac2ax = -\frac{b + \sqrt{b^{2} - 4 \, a c}}{2 \, a}, x=bb24ac2ax = -\frac{b - \sqrt{b^{2} - 4 \, a c}}{2 \, a}]
2 \, a}, x = -\frac{b - \sqrt{-4 \, a c + b^{2}}}{2 \, a}\right] }}}

Também podemos resolver sistemas de equações.

y = var('y') solve([x+y-6, x-y==4], x, y)
[[x=5x = 5, y=1y = 1]]

Note o uso do sinal de == para espressar uma igualdade algébrica.

Resolvendo Equações Numericamente

Às vezes solve não encontra uma solução para uma dada equação ou sistema de equações, nestes casos podemo buscar aproximações numéricas por meio da função find_root.

theta = var('theta') solve(cos(theta)==sin(theta), theta)
[sin(θ)=cos(θ)\sin\left(\theta\right) = \cos\left(\theta\right)]
find_root(cos(theta)==sin(theta), 0, pi)
0.78539816339744840.7853981633974484

Cálculo

Diferenciação e Integração

Vamos começar com uma derivada simples.

var('u') diff(sin(u), u)
uu
cos(u)\cos\left(u\right)

Agora a quarta derivada de sin(x2)sin(x^2)

diff(sin(x^2), x, 4)
16x4sin(x2)48x2cos(x2)12sin(x2)16 \, x^{4} \sin\left(x^{2}\right) - 48 \, x^{2} \cos\left(x^{2}\right) - 12 \, \sin\left(x^{2}\right)

Derivadas parciais também não são problema:

x, y = var('x,y') f = x^2 + 17*y^2 f.diff(x)
2x2 \, x
f.diff(y)
34y34 \, y

Integrais indefinidas e definidas

xsin(x2)dx\int x sin(x^2) dx

integral(x*sin(x^2), x)
12cos(x2)-\frac{1}{2} \, \cos\left(x^{2}\right)

01xx2+1dx\int_0^1 \frac{x}{x^2+1} dx

integral(x/(x^2+1), x, 0, 1)
12log(2)\frac{1}{2} \, \log\left(2\right)

Decomposição por frações parciais de 1x21\frac{1}{x^2-1}

f = 1/((1+x)*(x-1)) f.partial_fraction(x)
12(x+1)+12(x1)-\frac{1}{2 \, {\left(x + 1\right)}} + \frac{1}{2 \, {\left(x - 1\right)}}

Plotando Funções

f(x)=x^3+1 P=plot(f,(x,-1,1)) P

Como o objeto "plot" foi atribuído a uma variável, nehuma saída gráfica é gerada. Antes de visualizarmos este gráfico, vamos gerar outro e aprender como visualizar multiplos gráficos combinados.

Q=plot(1,(x,-1,1),color="red", linestyle="--") P+Q

Podemos modificar atributos do gráfico, para por exemplo, examinar mais de perto uma região:

(P+Q).show(xmin=-.1,xmax=.1,ymin=.99,ymax=1.01)

Podemos também adicionar nomes aos eixos e adicionar legendas.

plot(f,(x,-1,1),axes_labels=['$x$','$y$'],legend_label='$f(x)$',show_legend=True)

Como já percebemos a escala do gráfico é ajustada automáticamente, logo, funções que vão para infinito sao melhor visualizadas com limites explícitos:

plot(1/x^2,(x,-10,10),ymax=10)

Outra excelente ferramenta de exploração matemática do Sage, são as funções interativas.

@interact def plot_example(f=sin(x^2),r=range_slider(-5,5,step_size=1/4,default=(-3,3)), color=color_selector(widget='colorpicker'), thickness=(3,(1..10)), adaptive_recursion=(5,(0..10)), adaptive_tolerance=(0.01,(0.001,1)), plot_points=(20,(1..100)), linestyle=['-','--','-.',':'], gridlines=False, fill=False, frame=False, axes=True ): show(plot(f, (x,r[0],r[1]), color=color, thickness=thickness, adaptive_recursion=adaptive_recursion, adaptive_tolerance=adaptive_tolerance, plot_points=plot_points, linestyle=linestyle, fill=fill if fill else None), gridlines=gridlines, frame=frame, axes=axes)
Interact: please open in CoCalc

Podemos também fazer gráficos em três dimensões:

g(x,y)=sin(x^2+y^2) plot3d(g,(x,-5,5),(y,-5,5), plot_points=300)
3D rendering not yet implemented

Também podemos sobrepor gráficos tridimensionais:

b = 2.2 P=plot3d(sin(x^2-y^2),(x,-b,b),(y,-b,b), opacity=.7) Q=plot3d(0, (x,-b,b), (y,-b,b), color='red') P+Q
3D rendering not yet implemented

Agora um gráfico mais interessante: Um gráfico implícito!

var('x,y,z') T = golden_ratio p = 2 - (cos(x + T*y) + cos(x - T*y) + cos(y + T*z) + cos(y - T*z) + cos(z - T*x) + cos(z + T*x)) r = 4.78 implicit_plot3d(p, (x, -r, r), (y, -r, r), (z, -r, r), plot_points=50, color='yellow')
(xx, yy, zz)
3D rendering not yet implemented
1.61803398874989\renewcommand{\Bold}[1]{\mathbf{#1}}1.61803398874989