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
sage: integral(x/(x^2+1), x, 0, 1)
1/2*log(2)
计算\(\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]