1. 几何画板
几何画板可以用于在平面直角坐标系中绘制图形以及在图形上标注文字并进行简单的交互操作。下面是在几何画板上绘制函数$y=2x+1$的代码:
from sympy import *
from manim import *
init_printing()
class PlotFunction(GraphScene, MovingCameraScene):
CONFIG = {
"y_max": 5,
}
def construct(self):
self.x_max = 3*self.y_max/self.aspect_ratio
self.setup_axes(animate=True)
func_graph=self.get_graph(lambda x:2*x+1,self.function_color)
self.play(ShowCreation(func_graph))
self.wait()
代码解释:
GraphScene是manim库中用于绘制函数图像的场景之一,继承了Scene类中的所有属性和方法
MovingCameraScene是用于实现场景可视区域平移和缩放的场景之一,可以使得观众关注到关键部分
setup_axes是用于在场景中绘制直角坐标系的方法,其中y_max属性控制y轴最大值,x_max属性通过y_max属性和aspect_ratio属性自动计算得到
get_graph是用于绘制函数图像的方法,第一个参数为要绘制的函数表达式,第二个参数为函数图像的颜色
ShowCreation是用于动态显示图形的动画效果,将在屏幕上逐渐显示函数图像
wait是用于暂停场景的方法,可以等待观众看完目前显示的图形后再进行下一步操作
2. 函数单调性判断
2.1 函数单调性定义
在介绍如何进行区间分色之前,我们需要首先了解什么是函数的单调性。
函数$f(x)$在区间$[a,b]$上单调递增,是指对于该区间内的任意两个数$x_1$和$x_2(x_1 函数$f(x)$在区间$[a,b]$上单调递减,是指对于该区间内的任意两个数$x_1$和$x_2(x_1 判断函数在某个区间内的单调性有两种方法: 计算函数在该区间内的导数,如果导数恒大于零或恒小于零,则该函数在该区间内单调递增或单调递减 比较函数在该区间内相邻两点的取值,如果取值逐渐增大或逐渐减小,则该函数在该区间内单调递增或单调递减 通过以上方法可以得出某个函数在某个区间内的单调性,接下来我们需要将该区间分成多个颜色块,以便更加清晰地展示函数的单调性。这里以函数在区间$[a,b]$内单调递增为例,展示如何进行区间分色。 首先需要将区间$[a,b]$等分为$n$段,其中$n$为正整数,若令$x_0=a$,$x_n=b$,则$x_0 代码如下: a=0 b=10 n=5 step=(b-a)/n xs=[a+i*step for i in range(n+1)] ys=[] 代码解释: a和b为分割区间的左右端点,可以根据具体需求进行修改 n为分割区间的段数,可以根据具体需求进行修改 step为每段区间的长度 xs为分割后的区间列表,存储每段区间的左右端点 ys为每段区间的颜色编号列表,先设置为空列表 接下来需要计算函数在每段区间内的取值,以便进行比较和区间分色。对于每段区间$[x_i,x_{i+1}]$,计算该区间内的取值$f(x)$($x$为某一实数),取其中的最小值$f_{min}$和最大值$f_{max}$,再计算该区间的颜色编号$color$,该编号表示对该区间的取值进行分段,并为每一段分配一个颜色。 为了简单起见,这里假设颜色编号为$0,1,2,\ldots,k$,其中$k$为正整数,每个颜色所对应的取值范围相等且只与$k$有关。举个例子,如果$k=3$,则颜色$0$表示取值为$[f_{min},f_{min}+(f_{max}-f_{min})/3]$的区间,颜色$1$表示取值为$(f_{min}+(f_{max}-f_{min})/3,f_{min}+2(f_{max}-f_{min})/3]$的区间,颜色$2$表示取值为$(f_{min}+2(f_{max}-f_{min})/3,f_{max}]$的区间。这里用二分法实现。 代码如下: from scipy.optimize import minimize_scalar for i in range(n): x0=xs[i] x1=xs[i+1] res=minimize_scalar(lambda x:2*x+1,bounds=(x0,x1),method='bounded') y=res.fun ys.append(int((y-f_min)/(f_max-f_min)*k)) 代码解释: minimize_scalar是scipy库中用于单变量函数最小化的函数,第一个参数为待最小化的函数表达式,bounds参数为变量取值范围,method参数为求解方法 y为函数在当前区间的最小值,这里以$2x+1$为例 int((y-f_min)/(f_max-f_min)*k)为根据函数取值计算出的区间颜色编号 最后将每段区间按照计算出的颜色编号绘制出来,可以用manim库中的Rectangle对象进行绘制。针对不同的颜色,可以设置不同的填充颜色。 代码如下: colors=['#FF8C00','#008080','#0000FF'] rects=[] for i in range(n): rect=Rectangle(height=2,width=xs[i+1]-xs[i],fill_opacity=1) rect.move_to([xs[i]+rect.get_width()/2,ys[i]+rect.get_height()/2,0]) rect.set_fill(colors[ys[i]],1) rects.append(rect) self.play(*[Create(rect) for rect in rects]) self.wait() 代码解释: colors为不同区间颜色代码列表 Rectangle为manim库中的矩形对象,其中fill_opacity属性为填充透明度,1表示完全填充,0表示不填充 move_to方法为将图形移动至指定位置,参数为坐标 set_fill方法为设置填充颜色,第一个参数为颜色代码,第二个参数为透明度 Create为创建图形的动画效果 通过以上步骤,就可以在几何画板上实现对函数单调区间的分色了。首先需要通过计算区间内的函数取值,判断该区间的单调性,然后将该区间分成若干个颜色块,并为每个块指定颜色。这里仅提供了一种较为简单的区间分色方法,如需更加精细的区间分色效果,可以适当进行修改和拓展。2.2 函数单调性判断方法
3. 函数区间分色
3.1 区间等分
3.2 计算函数取值
3.3 区间绘制
总结