23、数学计算与编程:Sage及Python装饰器的深度探索

数学计算与编程:Sage及Python装饰器的深度探索

1. Sage导入与使用

在进行Sage编程时,导入模块是一个重要的步骤。通常,我们可以使用 all 模块一次性导入Sage的所有内容。不过,由于Sage规模庞大,仅导入实际需要的函数和类是更好的做法。但目前Sage的结构使得我们必须导入全部内容才能确保正常运行。

若要在Python命令行交互地尝试示例,可以使用 –python 选项运行Sage以获得交互式Python shell,之后在命令行运行表达式并查看结果。

我们还可以使用Python脚本访问Sage函数来解决常微分方程(ODE)。例如,在之前的学习中,我们了解了使用 desolve 函数求解常微分方程,现在可以用Python脚本来重复这个示例,但要注意不能从Python脚本中查看绘图结果。

2. Python装饰器介绍

2.1 装饰器基础

Python装饰器是Python语言的一个新特性,虽然它和“装饰器”设计模式概念相似,但并非其实现。我们在后续实现交互式图形时会用到装饰器。

以下是一个简单的装饰器示例:

def html_table(func):
    def display_output(*args):
        result = func(*args)
        html_string = '<table border=1><tr>'
        for item in result:
            html_string += '<td>' + str(item) + '</td>'
        html_string += '</tr></table>'
        html(html_string)
        return result
    return display_output

@html_table
def square_list(my_list):
    for i in range(len(my_list)):
        my_list[i] = my_list[i]**2
    return my_list

x = square_list([1.0, 2.0, 3.0])
print(x)

在这个示例中,我们定义了一个名为 square_list 的函数,它接受一个列表作为参数,将列表中的每个元素平方并返回结果。同时,我们定义了一个装饰器函数 html_table ,它接受一个函数作为参数 func ,并返回一个新的函数 display_output display_output 接受与 func 相同的参数并返回相同的结果,但在返回之前,它会创建并显示一个HTML表格来展示列表中的值。使用 @ 符号表示 html_table 装饰 square_list

2.2 装饰器相关练习

2.2.1 理解函数装饰器

以下代码的输出是什么呢?可以先尝试思考,再运行代码进行验证。

def decorator(func):
    def print_value(*args):
        print("Value is:")
        result = func(*args)
        return result
    return print_value

@decorator
def my_function(my_arg):
    print(my_arg)
    return my_arg

x = my_function('text')
2.2.2 改进装饰器

html_table 装饰器目前只能处理一维列表,我们可以将其扩展以处理多维列表、Sage矩阵或NumPy矩阵。扩展后的装饰器函数应能将二维数据显示为HTML表格,可使用 <tr> 起始标签和 </tr> 结束标签来创建表格的新行。相关HTML表格的帮助可参考:http://www.w3schools.com/html/html_tables.asp

2.2.3 实现记忆化装饰器

“记忆化”是一种优化技术,它通过缓存先前函数调用的结果,在使用相同参数再次调用函数时返回已保存的值,从而加快函数调用速度。Python装饰器是为现有Python函数添加此功能的好方法。可以参考以下链接的示例来实现“记忆化”装饰器:
- http://en.wikipedia.org/wiki/Memoization
- http://wiki.python.org/moin/PythonDecoratorLibrary#Memoize

3. 制作交互式图形

3.1 交互式控件示例

Sage笔记本界面可用于创建由简单图形控件控制的交互式示例,这一功能类似于Mathematica中的 Manipulate 函数,对于创建教学工具帮助学生学习新的数学概念非常有用。以下是一些基本控件的示例:

@interact
def _(t=text_control('Static text goes here')):
    pass

@interact
def _(value = slider(vmin=0, vmax=10, step_size=1, default=5,
    label='Slide me:', display_value = True)):
    print(value)

# 快捷方式
@interact
def _(value1=(1..10), value2=(0,100,10), value3=(1,10)):
    print(value1)
    print(value2)
    print(value3)

@interact
def _(value = range_slider(0, vmax=10, step_size=1, default=(3,7),
    label='Slide me:', display_value = True)):
    print(value)

@interact
def _(checked = checkbox(True, "Check the box:")):
    print(checked)

# 快捷方式
@interact
def _(check_value = True):
    print(check_value)

@interact
def _(value1 = selector(['a','b','c'], label='Choose one:', 
        default='b'),
    value2 = selector(['a','b','c','d'], label='Choose one:', 
        default='b', nrows=2, ncols=2)):
    print(value1)
    print(value2)

# 快捷方式
@interact
def _(value1 = ['a','b','c'], value2=[1,2,3,4,5,6]):
    print(value1)
    print(value2)

@interact
def _(s = input_box(default='type here', label='Type something: ',
    type=str, width=40)):
    print(s)

# 快捷方式
@interact
def _(s1, s2 = 'type here'):
    print(s1)
    print(s2)

@interact
def _(m = input_grid(nrows=2, ncols=2, default=0,
    label='Input matrix:')):
    print(m)

# 快捷方式
default_matrix = Matrix(QQ, 2, 4)
@interact
def _(input_matrix = default_matrix):
    print(input_matrix)

@interact
def _(color = color_selector(default=(1,0,0), 
    label='Choose a color:', widget='farbtastic', hide_box=False)):
    print(color)

# 快捷方式
@interact
def _(color = Color('red')):
    print(color)

3.2 交互式控件原理

这些示例使用了Python函数装饰器,Sage定义了一个名为 interact 的装饰器。当使用 @interact 装饰一个函数时, interact 会被调用,我们定义的函数会作为参数传递给它。 interact 使用该函数构建一个交互式图形用户界面。函数的关键字参数定义了界面的元素,函数体中的语句决定了用户与控件交互时的操作。

例如,创建复选框的代码如下:

@interact
def _(checked = checkbox(True, "Check the box:")):
    print(checked)

函数名使用单个下划线是一种约定,只要不与其他名称冲突即可。函数有一个关键字参数,关键字是包含控件结果的变量名, checkbox 是创建控件的函数,它接受默认值和控件标签两个可选参数。当用户点击复选框时,函数体中的语句会被执行,这里会将控件返回的值打印在控件下方。

虽然有很多创建控件的快捷方式,但这些快捷方式通常对控件外观的控制较少,不建议使用,因为不熟悉快捷方式的人在不研究 interact 模块文档的情况下很难理解代码的工作原理。

3.3 交互式示例实践

以下是一个将之前示例变为交互式的代码:

var('x,y')
@interact
def _(c1 = slider(vmin=0, vmax=3, default=2, label='c1:'),
        c2 = slider(vmin=-3, vmax=3, default=1, label='c2:'),
        c3 = slider(vmin=-3, vmax=3, default=1, label='c3:'),
        c4 = slider(vmin=0, vmax=3, default=2, label='c4:')):
    c=vector(RDF,[-4,-5])
    G=matrix(RDF,[[c1,c2],[c3,c4],[-1,0],[0,-1]])
    h=vector(RDF,[3,3,0,0])
    sol=linear_program(c,G,h)
    print("Minimum:" + str(sol['x']))
    print("Slack variables: " + str(sol['s']))
    c1_plot = implicit_plot(c1*x + c2*y ==3, (x,0,6), (y,0,6))
    c2_plot = implicit_plot(c3*x + c4*y == 3, (x,0,6), (y,0,6))
    c3_plot = implicit_plot(x == 0, (x,0,6), (y,0,6))
    c4_plot = implicit_plot(y == 0, (x,0,6), (y,0,6))
    min_plot = point(sol['x'], color='red', size=50)
    rp = region_plot([c1*x + c2*y <= 3, c3*x + c4*y <= 3, x >= 0,  
        y >= 0], (x,0,6), (y,0,6))
    g = graphics_array([c1_plot+c2_plot+c3_plot+c4_plot+min_plot,
        rp],1,2)
    g.show(aspect_ratio=1)

在这个示例中,我们从之前的示例出发,将其变为交互式。定义了一个名为 _ 的函数,使用 @interact 装饰器。创建了四个滑块控件,将之前示例的代码粘贴到函数体中并做了一些修改。线性约束由矩阵 G 和向量 h 表示,我们将矩阵中的四个元素改为变量,滑块控件用于设置这些变量的值。当移动滑块时,约束条件会改变,最小值会重新计算,绘图也会重新绘制。由于线性规划可以快速求解,所以这个示例很适合用户交互。

3.4 泰勒级数交互式示例挑战

我们可以将之前演示泰勒级数在区域内随着项数增加收敛到函数的示例变为交互式,允许用户更改级数的项数,并更新图形以显示级数如何收敛到函数。

4. 相关技术总结

4.1 主要技术点总结

技术点 描述
Sage导入 使用 all 模块一次性导入,或按需导入但需注意整体结构
Python装饰器 用于扩展函数功能,如 html_table 装饰器
交互式图形 通过 interact 装饰器和各种控件创建
常微分方程求解 使用Sage函数和Python脚本

4.2 学习资源

  • interact 模块的完整文档:http://sagemath.org/doc/reference/sagenb/notebook/interact.html
  • 许多交互式示例及源代码:http://wiki.sagemath.org/interact

通过这些技术和资源,我们可以更深入地探索数学计算和编程的结合,利用Sage和Python的强大功能解决各种数学问题。

graph LR
    A[Sage导入] --> B[Python装饰器]
    B --> C[交互式图形]
    C --> D[常微分方程求解]
    D --> E[泰勒级数交互式示例]
    F[学习资源] --> A
    F --> B
    F --> C
    F --> D
    F --> E

以上内容涵盖了Sage的导入与使用、Python装饰器的介绍和应用,以及如何使用Sage创建交互式图形等重要知识点,希望能帮助大家更好地掌握相关技术。

5. 符号计算与绘图功能

5.1 符号表达式操作

在数学计算中,符号表达式的操作是非常重要的。我们可以使用Sage定义和操作符号表达式。例如,定义符号变量可以使用 var 函数:

var('x y')
expr = x^2 + y^2

对于符号表达式,我们可以进行多种操作,如展开、化简、求导、积分等。
- 展开表达式 :使用 expand 方法可以展开多项式。

expr = (x + y)^2
expanded_expr = expr.expand()
print(expanded_expr)
  • 化简表达式 :使用 simplify 方法可以化简表达式。
expr = (x^2 - y^2) / (x - y)
simplified_expr = expr.simplify()
print(simplified_expr)
  • 求导 :使用 diff 函数可以对表达式求导。
expr = x^3
derivative = expr.diff(x)
print(derivative)
  • 积分 :使用 integrate 函数可以对表达式进行积分。
expr = x^2
integral = expr.integrate(x)
print(integral)

5.2 绘图功能

Sage具有强大的绘图功能,可以绘制各种类型的图形,包括二维和三维图形。

5.2.1 二维绘图
  • 函数绘图 :使用 plot 函数可以绘制函数的图形。
f = x^2
p = plot(f, (x, -2, 2))
p.show()
  • 参数绘图 :使用 parametric_plot 函数可以绘制参数方程的图形。
t = var('t')
x = cos(t)
y = sin(t)
p = parametric_plot((x, y), (t, 0, 2*pi))
p.show()
  • 散点图 :使用 scatter_plot 函数可以绘制散点图。
data = [(1, 2), (2, 4), (3, 6)]
p = scatter_plot(data)
p.show()
5.2.2 三维绘图
  • 三维曲面绘图 :使用 plot3d 函数可以绘制三维曲面。
x, y = var('x y')
f = x^2 + y^2
p = plot3d(f, (x, -2, 2), (y, -2, 2))
p.show()
  • 参数三维绘图 :使用 parametric_plot3d 函数可以绘制参数三维图形。
u, v = var('u v')
x = cos(u)*cos(v)
y = cos(u)*sin(v)
z = sin(u)
p = parametric_plot3d((x, y, z), (u, 0, 2*pi), (v, 0, pi))
p.show()

6. 线性代数与优化问题

6.1 线性代数运算

线性代数是数学中的重要分支,Sage提供了丰富的线性代数功能。

6.1.1 矩阵操作
  • 创建矩阵 :使用 matrix 函数可以创建矩阵。
A = matrix([[1, 2], [3, 4]])
print(A)
  • 矩阵运算 :可以进行矩阵的加法、乘法、求逆等运算。
B = matrix([[5, 6], [7, 8]])
C = A + B  # 矩阵加法
D = A * B  # 矩阵乘法
E = A.inverse()  # 矩阵求逆
print(C)
print(D)
print(E)
  • 特征值和特征向量 :使用 eigenvalues eigenvectors_right 方法可以计算矩阵的特征值和特征向量。
A = matrix([[1, 2], [3, 4]])
eigenvalues = A.eigenvalues()
eigenvectors = A.eigenvectors_right()
print(eigenvalues)
print(eigenvectors)
6.1.2 线性方程组求解

使用 solve_right 方法可以求解线性方程组。

A = matrix([[1, 2], [3, 4]])
b = vector([5, 6])
x = A.solve_right(b)
print(x)

6.2 优化问题求解

Sage可以用于求解各种优化问题,如线性规划、非线性优化等。

6.2.1 线性规划

使用Sage可以求解线性规划问题。以下是一个简单的线性规划示例:

c = vector(RDF, [-4, -5])
G = matrix(RDF, [[1, 2], [3, 4], [-1, 0], [0, -1]])
h = vector(RDF, [3, 3, 0, 0])
sol = linear_program(c, G, h)
print("Minimum:", sol['x'])
print("Slack variables:", sol['s'])
6.2.2 非线性优化

对于非线性优化问题,可以使用Sage的优化函数,如 find_minimum_on_interval find_maximum_on_interval

f = x^2 - 2*x + 1
min_val = find_minimum_on_interval(f, -2, 2)
print("Minimum value:", min_val)

7. 微分方程求解

7.1 一阶常微分方程求解

常微分方程在数学和工程领域有广泛的应用。Sage可以用于求解常微分方程。对于一阶常微分方程,可以使用 desolve 函数。

var('t y')
de = diff(y(t), t) == y(t)
sol = desolve(de, y(t), ics=[0, 1])
print(sol)

7.2 高阶常微分方程求解

对于高阶常微分方程,同样可以使用 desolve 函数。以下是一个二阶常微分方程的示例:

var('t y')
de = diff(y(t), t, 2) + y(t) == 0
sol = desolve(de, y(t), ics=[0, 1, 0])
print(sol)

7.3 微分方程组求解

Sage也可以求解微分方程组。以下是一个简单的微分方程组示例:

var('t x y')
de1 = diff(x(t), t) == y(t)
de2 = diff(y(t), t) == -x(t)
des = [de1, de2]
sol = desolve_system(des, [x(t), y(t)], ics=[0, 1, 0])
print(sol)

8. 综合应用与拓展

8.1 数据处理与拟合

在实际应用中,数据处理和拟合是常见的任务。我们可以使用Sage进行数据的读取、处理和拟合。以下是一个简单的数据拟合示例:

data = [(1, 2), (2, 4), (3, 6)]
f = find_fit(data, x, solution_dict=True)
print(f)

8.2 模拟与仿真

我们可以使用Sage创建模拟和仿真程序。例如,创建一个简单的战斗模拟包:

# 以下为简单示意代码,具体实现可根据需求扩展
class Tank:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def move(self, dx, dy):
        self.x += dx
        self.y += dy

tank1 = Tank(0, 0)
tank1.move(1, 1)
print(tank1.x, tank1.y)

8.3 未来学习方向

  • 深入学习Sage的高级功能,如更复杂的符号计算、优化算法等。
  • 结合Python的其他库,如NumPy、Matplotlib等,进一步拓展功能。
  • 探索Sage在不同领域的应用,如物理、工程、经济等。
graph LR
    A[符号计算] --> B[线性代数]
    B --> C[优化问题]
    C --> D[微分方程求解]
    D --> E[数据处理与拟合]
    E --> F[模拟与仿真]
    G[未来学习方向] --> A
    G --> B
    G --> C
    G --> D
    G --> E
    G --> F

通过对Sage和Python相关技术的学习和应用,我们可以解决各种数学和工程问题。从符号计算到绘图,从线性代数到优化问题,再到微分方程求解和综合应用,这些技术为我们提供了强大的工具。希望大家在学习过程中不断探索和实践,将这些技术应用到实际项目中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值