Loading

sagemath与代数学

基础代数与微积分

Sage可以执行与基本代数和微积分相关的各种计算:例如,求解方程、微分、积分和拉普拉斯变换。见 Sage Constructions 更多示例的文档。

在所有这些示例中,需要注意的是,函数中的变量定义为 var(...)

精确解方程

这个 solve 函数解方程。要使用它,首先指定一些变量;然后指定 solve 是一个方程(或方程组),以及要求解的变量:

sage: x = var('x')
sage: solve(x^2+3*x+2,x)
[x == -2, x == -1]

可以根据其他变量求解一个变量的方程:

sage: x, b, c = var('x b c')
sage: solve([x^2 + b*x + c == 0],x)
[x == -1/2*b - 1/2*sqrt(b^2 - 4*c), x == -1/2*b + 1/2*sqrt(b^2 - 4*c)]

也可以求解多个变量:

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

以下使用Sage求解非线性方程组的示例由Jason screet提供:首先,我们象征性地求解该系统:

sage: var('x y p q')
(x, y, p, q)
sage: eq1 = p+q==9
sage: eq2 = q*y+p*x==-6
sage: eq3 = q*y^2+p*x^2==24
sage: solve([eq1,eq2,eq3,p==1],p,q,x,y)
[[p == 1, q == 8, x == -4/3*sqrt(10) - 2/3, y == 1/6*sqrt(10) - 2/3], [p == 1, q == 8, x == 4/3*sqrt(10) - 2/3, y == -1/6*sqrt(10) - 2/3]]

对于解的数值近似,可以使用:

sage: solns = solve([eq1,eq2,eq3,p==1],p,q,x,y, solution_dict=True)
sage: [[s[p].n(30), s[q].n(30), s[x].n(30), s[y].n(30)] for s in solns]
[[1.0000000, 8.0000000, -4.8830369, -0.13962039],
 [1.0000000, 8.0000000, 3.5497035, -1.1937129]]

(功能 n 打印数值近似值,参数是精度的位数。)

数值求解方程

很多时候, solve 将无法找到指定方程的精确解。当它失败时,你可以使用 find_root 找到一个数值解。例如,solve对于以下等式不返回任何有趣的内容:

sage: theta = var('x')
sage: solve(cos(x)==sin(x), x)
[sin(x) == cos(x)]

另一方面,我们可以使用 find_root 在这个范围内求上述方程的解 $0<ϕ<π/2 $:

sage: phi = var('phi')
sage: find_root(cos(phi)==sin(phi),0,pi/2)
0.7853981633974484

微分

微分:

sage: u=var('u')
sage: diff(sin(u),u)
cos(u)
sage: diff(sin(u^2),u,4)
16*u^4*sin(u^2) - 48*u^2*cos(u^2) - 12*sin(u^2)

计算 \(x^2+17y^2\) 关于 \(x\)\(y\) ,分别为:

sage: x, y = var('x,y')
sage: f = x^2 + 17*y^2
sage: f.diff(x)
2*x
sage: f.diff(y)
34*y
sage: show(f)
sage: show(f.diff(x))		#求导
#show()这样会直接展示式子的latex形式
sage: latex(f.diff(x))

进行微分和积分

sage: R = PolynomialRing(QQ,"x")
sage: x = R.gen()
sage: p = x^2 + 1
sage: p.derivative()
2*x
sage: p.integral()
1/3*x^3 + x
R = PolynomialRing(QQ,"x")
x = R.gen()
p = x^2 + 1
print(p.derivative())	#微分
print(p.integral())		#积分

如果键入view(f.diff(x))另一个窗口,将打开显示编译输出,将会打印成一个pdf其中输出由 LaTeX 排版。

积分

数值积分在 下面黎曼和梯形求和积分中讨论。

Sage可以自己集成一些简单的功能,包括不定积分和定积分:

sage: f = x^3
sage: f.integral(x)		#求积分1
1/4*x^4
sage: f = x*sin(x^2)
sage: integral(f,x)		#求积分2
-1/2*cos(x^2)

Sage 还可以计算涉及极限的符号定积分 。

sage: integrate(1/x^2, x, 1, infinity)		#求1/x^2在1处的极限
1

\[\lim _{x \rightarrow 1} \int_{1}^{\infty} \frac{1}{x^{2}} d x \]

sage: integral(x/(x^2+1), x, 0, 1)
1/2*log(2)

\[\int_0^1 \frac{{x}}{{x^2+1}}\, dx \]

计算\(\frac{{1}}{{x^2-1}}\)

sage: f = 1/((1+x)*(x-1))
sage: f.partial_fraction(x)
-1/2/(x + 1) + 1/2/(x - 1)

解微分方程

可以用Sage来研究常微分方程。解方程\(x'+x-1=0\)

sage: t = var('t')    # define a variable t
sage: x = function('x')(t)   # define x to be a function of that variable
sage: DE = diff(x, t) + x - 1
sage: desolve(DE, [x,t])
(_C + e^t)*e^(-t)

临界点#

您可以找到分段定义函数的临界点:

x = PolynomialRing(RationalField(), 'x').gen()
f1 = x^0
f2 = 1-x
f3 = 2*x
f4 = 10*x-x^2
f = piecewise([((0,1),f1), ((1,2),f2), ((2,3),f3), ((3,10),f4)])	#定义分段函数
print(f.critical_points())		#[5.0]

幂级数

Sage 提供了多种构建和使用幂级数的方法。

要从函数表达式中获取泰勒级数,请使用表达式 .taylor()上的方法:

#命令行
sage: var('x')
x
sage: g = sin(x)
sage: g.taylor(x,0,3)		#获取泰勒级数
-1/6*x^3 + x

函数的形式幂级数展开可以用下面的 .series()方法:

sage: sin(x).series(x,7)	#直接对函数进行展开
1*x + (-1/6)*x^3 + 1/120*x^5 + Order(x^7)

然而,目前很难对此类系列进行某些操作。有两种选择:要么使用 Sage 的 Maxima 子系统来实现完整的符号功能:

sage: f = log(sin(x)/x)
sage: f.taylor(x, 0, 10)		#获取泰勒级数
-1/467775*x^10 - 1/37800*x^8 - 1/2835*x^6 - 1/180*x^4 - 1/6*x^2
sage: maxima(f).powerseries(x,0)._sage_()		#计算通项公式
sum(2^(2*i2 - 1)*(-1)^i2*x^(2*i2)*bern(2*i2)/(i2*factorial(2*i2)), i2, 1, +Infinity)
sage: 

或者可以使用正式的幂级数环进行快速计算。另一方面,这些缺少符号函数:

sage: R.<w> = QQ[[]]		#构造一个有理数上的环
sage: ps = w + 17/2*w^2 + 15/4*w^4 + O(w^6); ps
w + 17/2*w^2 + 15/4*w^4 + O(w^6)
sage: ps.exp()
1 + w + 9*w^2 + 26/3*w^3 + 265/6*w^4 + 413/10*w^5 + O(w^6)
sage: (1+ps).log()
w + 8*w^2 - 49/6*w^3 - 193/8*w^4 + 301/5*w^5 + O(w^6)
sage: (ps^1000).coefficients()
[1, 8500, 36088875, 102047312625, 1729600092867375/8]
posted @ 2023-01-24 22:57  vconlln  阅读(1057)  评论(0编辑  收藏  举报