函数图像绘图器
y = f(x)(支持 sin cos tan log sqrt 等)
x 范围 [a, b]
y 范围(自动)
y=f(x) 实时绘图/缩放平移
y = f(x)(支持 sin cos tan log sqrt 等)
x 范围 [a, b]
y 范围(自动)
了解工具定位 · 使用场景 · 对比优势
学生在做数学作业时,手绘函数图像容易出错,尤其遇到分式函数、复合函数或含参函数。用本工具输入解析式 y=f(x),立即生成精确曲线,支持缩放平移观察局部细节。例如验证 y=1/x 的渐近线、y=sin(2x) 的周期变化,比手绘快 10 倍,且不会漏掉关键拐点。
教师或自学者需要理解参数对函数形状的影响,例如 y=a·x²+b 中 a 的正负决定开口方向、b 决定顶点位置。本工具支持同时输入多个函数(如 y=x²、y=2x²、y=x²+3),在同一坐标系内叠加显示,通过平移缩放直观对比振幅、相位、截距变化,替代静态教材的抽象描述。
解方程 f(x)=g(x) 时,代数法可能繁琐或无法直接求解。本工具将两个函数图像绘制在同一坐标系中,交点即为方程的解。例如求 x²=ln(x) 的近似根,直接观察交点横坐标,再通过缩放功能定位到小数点后两位,适合工程估算或数学实验。
学习导数的几何意义时,需要理解某点切线斜率与函数变化率的关系。本工具输入函数 y=f(x) 和指定点 x₀,可手动标记该点并观察切线方向。通过缩放局部区域,清晰看到函数在该点附近的线性逼近效果,辅助理解导数定义中的极限过程。
工程师在分析实验数据时,常需要快速验证经验公式是否合理。例如温度传感器输出与温度的关系假设为 y=kx+b,将实测数据点与理论曲线叠加绘制,通过缩放查看偏差分布。本工具无需安装软件,浏览器打开即用,适合现场快速检查拟合质量。
| 维度 | 本工具 | GeoGebra | 传统方法(纸笔/计算器) |
|---|---|---|---|
| 数据隐私 | 纯浏览器计算,函数表达式不上传服务器 | 部分功能需联网同步数据 | 完全离线,无数据泄露风险 |
| 处理速度 | 输入即渲染,实时响应 | 复杂函数(如含参数动画)可能有短暂延迟 | 手动描点绘图,速度取决于用户熟练度 |
| 离线可用 | 完全离线,加载后断网可用 | 部分功能(如在线资源库)需联网 | 完全离线 |
| 交互方式 | 鼠标拖拽平移/滚轮缩放,实时更新 | 支持拖拽、缩放及滑动条参数调节 | 静态图像,无法交互 |
| 功能复杂度 | 专注 y=f(x) 快速绘图,操作极简 | 集成了几何、代数、统计等完整数学套件 | 仅能绘制有限个点或简单函数 |
| 使用门槛 | 打开即用,零学习成本 | 功能丰富但界面复杂,新手需学习 | 需掌握函数计算和坐标纸绘图技巧 |
上手步骤 · 输入输出 · 避坑提示
| 输入 | 输出 | 说明 |
|---|---|---|
| y=sin(x) | 正弦波图像,周期 2π,振幅 1,在 x=0 处过原点 | 典型常规场景:基础三角函数的实时绘图 |
| y=x^2 | 开口向上的抛物线,顶点在原点 (0,0),对称轴为 y 轴 | 典型常规场景:二次函数的图像验证 |
| y=1/x | 双曲线,两条渐近线为 x=0 和 y=0,第一、三象限对称 | 边界 case:在 x=0 处有间断点,测试工具对奇点的处理 |
| y=tan(x) | 正切曲线,周期 π,在 x=π/2 + kπ 处有垂直渐近线 | 边界 case:含无穷间断点的函数,测试缩放后渐近线显示 |
| y=sqrt(x) | 从原点出发向右延伸的曲线,定义域 x≥0,值域 y≥0 | 边界 case:定义域非全体实数,测试工具对输入范围的限制 |
| y=abs(x) | V 形折线,顶点在原点,左右对称,斜率分别为 -1 和 1 | 易错 case:新手常误以为绝对值函数是平滑曲线,实际是折线 |
| y=ln(x) | 自然对数曲线,在 x=0 处有垂直渐近线,过点 (1,0),单调递增 | 易错 case:用户可能输入 x≤0 导致无定义,需注意定义域 |
| y=x^3 - 3x | 三次曲线,有两个极值点(局部极大和极小),过原点 | 典型常规场景:含极值点的多项式函数,适合观察导数特征 |
y=2x^3+5xy=2*x^3+5*x数学手写中省略乘号是惯例,但函数图像工具使用标准计算表达式语法,乘号 '*' 和乘方 '^' 必须显式写出。
y=sin(x+1y=sin(x+1)表达式解析器依赖括号配对来确定运算优先级;左括号数量不等于右括号数量时,解析器无法构造语法树,直接报错。
y=sin(90)y=sin(pi/2) 或 y=sin(1.5708)几乎所有编程语言和数学工具的三角函数默认采用弧度制;sin(90) 实际计算的是 sin(90 rad) ≈ 0.894,而非期望的 1。
y=ln(x)y=log(x)不同工具对 ln/log 的命名约定不同;本工具遵循多数编程语言惯例,log 表示自然对数(底数 e),不接受 ln 作为函数名。
y=sin(x)y=sin(x)等号、括号、逗号等符号必须使用英文半角字符;中文全角符号不被表达式解析器识别,导致解析失败或意外字符错误。
y=sqrt(x) 输入 x 范围 -10 到 10y=sqrt(x) 输入 x 范围 0 到 10sqrt 定义域为 x≥0;负半轴无实数解,图像在 x<0 区域会显示空白或断点,并非工具 bug,而是数学定义限制。
y==x^2y=x^2表达式语法中单等号 '=' 表示函数定义;双等号 '==' 是关系运算符,会被解析为布尔比较表达式,导致图像出现意料之外的离散点或空图。
y=2x+3y=2*x+3 或 y=2x+3(取决于工具是否支持隐式乘法)部分工具(如 Desmos)支持隐式乘法,本工具不支持;'2x' 会被解析为标识符而非 '2*x',导致变量未定义错误。
y=a*x^2 + b*x + cy=2*x^2 + 3*x + 1(代入具体数值)本工具仅支持自变量 x 和预定义常数(如 pi, e);a、b、c 等字母会被视为未定义变量,导致解析失败。
公式推导 · 流程图解 · 依据出处
y = f(x)
x — 自变量,实数域内任意值y — 因变量,由函数 f 映射得到f — 用户自定义的数学函数表达式绘制正弦函数:输入 f(x) = sin(x)。取 x = 0, π/2, π, 3π/2, 2π,对应 y = 0, 1, 0, -1, 0。图像为周期 2π 的波浪曲线,振幅 1。
适用于任意定义在实数域上的初等函数(多项式、三角函数、指数、对数等)。不适用于分段函数、隐函数、参数方程(需额外输入格式)。数据来源:数学分析标准定义。
3 种主流语言 · 复制即用
import numpy as np
import matplotlib.pyplot as plt
# 定义函数和 x 范围
def f(x):
return np.sin(x) + 0.5 * np.cos(2 * x)
x = np.linspace(-10, 10, 1000)
y = f(x)
# 绘图并设置缩放
plt.figure(figsize=(8, 4))
plt.plot(x, y, label='y = sin(x) + 0.5*cos(2x)')
plt.xlim(-5, 5) # 水平缩放
plt.ylim(-2, 2) # 垂直缩放
plt.grid(True, alpha=0.3)
plt.legend()
plt.show()package main
import (
"fmt"
"math"
"os"
"strconv"
)
// 计算 y = sin(x) + 0.5*cos(2x) 在 x 处的值
func f(x float64) float64 {
return math.Sin(x) + 0.5*math.Cos(2*x)
}
func main() {
if len(os.Args) < 2 {
fmt.Println("用法: go run main.go <x值>")
return
}
x, err := strconv.ParseFloat(os.Args[1], 64)
if err != nil {
fmt.Println("无效的 x 值:", err)
return
}
y := f(x)
fmt.Printf("f(%.4f) = %.6f\n", x, y)
}// 使用 Canvas API 绘制函数图像
const canvas = document.getElementById('plot');
const ctx = canvas.getContext('2d');
// 定义函数
const f = (x) => Math.sin(x) + 0.5 * Math.cos(2 * x);
// 绘图参数
const xMin = -5, xMax = 5;
const yMin = -2, yMax = 2;
const width = canvas.width, height = canvas.height;
// 坐标映射:世界坐标 → 像素坐标
const toPixelX = (x) => ((x - xMin) / (xMax - xMin)) * width;
const toPixelY = (y) => height - ((y - yMin) / (yMax - yMin)) * height;
// 绘制曲线
ctx.beginPath();
ctx.strokeStyle = 'blue';
ctx.lineWidth = 2;
const step = (xMax - xMin) / width;
for (let px = 0; px <= width; px++) {
const x = xMin + (px / width) * (xMax - xMin);
const y = f(x);
const py = toPixelY(y);
px === 0 ? ctx.moveTo(px, py) : ctx.lineTo(px, py);
}
ctx.stroke();8 个高频疑问