计算工具 · 数学计算

函数图像

y=f(x) 实时绘图/缩放平移

本地处理 · 不上传 免费 · 无需登录 无次数限制 累计 57 次使用
函数列表多条 y=f(x) 叠绘
视窗范围滚轮缩放 · 拖拽平移
滚轮缩放(指针处为中心)· 拖拽平移 · 双击复位 · 移动鼠标查看 (x, y) 读数。表达式支持 sin cos tan ln log sqrt abs ^ 与隐式乘法 2x
示例函数库点击替换第一条 · 经典曲线一键载入
表达式语法自写安全解析器 · 零 eval · CSP 合规

运算符+ - * / ^(幂,右结合)%(取模)· 一元负号 -x · 括号 ( )

隐式乘法2x = 2·x,2sin(x)3(x+1)(x+1)(x-1)xpi

变量·常量变量 x · 常量 pi(π)e(自然底)tau(2π)phi(黄金比)

单参函数sin cos tan asin acos atan sinh cosh tanh ln(自然对数) log(底 10) log2 exp sqrt cbrt abs floor ceil round sign

双参函数pow(a,b) min(a,b) max(a,b) atan2(y,x) log(x,b)(以 b 为底) mod(a,b)

不连续1/x tan(x),渐近线处自动断笔,不绘制穿越竖线。

就绪 · 多函数实时绘图 · 滚轮缩放/拖拽平移/双击复位 · 自写表达式解析器(零 eval)
第一节

关于本工具

About

数学课上画 y=sin(1/x) 时,老师总说“靠近零会剧烈震荡”,但黑板上只能画个大概。这个工具让函数图像在指尖缩放平移:输入表达式,浏览器逐点计算并绘制,鼠标拖拽即可观察任意区间的曲线细节。所有运算都在本地完成,不向服务器发送任何数据——适合课堂验证、作业检查或探索复杂函数行为。

使用场景

物理作业验证

高一学生做完自由落体位移公式 s=½gt² 的课后习题,手算结果与参考答案差 0.3 米,不确定是代入错还是概念理解偏。在工具输入函数 y=0.5*9.8*x²,拖动 x 轴滑块查看 t=2 秒时 y=19.6,与课本标准值一致,确认自己计算步骤无误。省去翻答案、问同学的等待,直接看到函数曲线与数值对应关系。

炒股均线交叉判断

散户观察 5 日与 20 日均线金叉信号,但券商 APP 只显示近 30 分钟数据,无法拉长周期看历史交叉后的走势规律。把 MA5 和 MA20 的移动平均公式输入工具,调节 x 轴范围从 0 到 120 个周期,缩放观察每次金叉后股价的涨跌幅度与持续时间,辅助判断当前信号的有效性。

装修吊顶弧度设计

木工师傅要在一面 4 米宽的墙上做抛物线形吊顶,业主给的草图只有最高点离地 2.8 米、两端 2.4 米。用顶点式 y=a(x-h)²+k,设 h=2、k=2.8,调整 a 值使 x=0 和 x=4 时 y=2.4,实时看到曲线是否平滑、中间是否碰灯位。确定参数后直接按坐标放线,避免返工。

编程调试波形对比

嵌入式开发者在 STM32 上采集了温度传感器的电压数据,想验证实际波形是否接近理论 RC 充放电曲线 V(t)=V₀(1-e^{-t/RC})。把理想函数输入工具,设置 R=10kΩ、C=100μF,缩放时间轴到 0-5 秒,再对照示波器截图上的点逐一比对,快速定位是电容漏电还是采样频率不足。

房贷等额本息试算

准备签合同的购房者看到银行给的月供 5236 元,想自己验算是否含隐形费用。用等额本息公式 M=P*r*(1+r)^n/[(1+r)^n-1],输入本金 100 万、年利率 3.8%、30 年,工具生成整个 360 期的还款曲线,拖动到第 180 期看到剩余本金 58 万,与银行提供的还款计划表逐月核对,确认无出入。

对比矩阵

维度本工具竞品 A(Desmos)传统方法(纸笔 / 计算器)
实时交互输入即绘图,支持鼠标拖拽平移/滚轮缩放同样实时,交互流畅,支持触摸手势需逐点描画,修改函数需重画
离线可用完全浏览器端运行,无需联网需联网加载,离线功能有限完全离线
函数支持支持 y=f(x) 显函数,含初等函数支持显/隐/参数/极坐标函数仅能绘制简单显函数
缩放精度自由缩放,精度受屏幕像素限制自由缩放,支持坐标轴锁定比例受纸张/计算器分辨率限制
导出方式截图或复制图像截图/分享链接/嵌入代码手动复制或拍照
第二节

使用指南

Getting Started

使用步骤

  1. 1在输入框键入函数表达式(如 sin(x)),画布立即显示对应曲线,坐标轴自动适配
  2. 2拖动画布空白区域平移视图,曲线随鼠标移动同步更新位置
  3. 3滚动鼠标滚轮或双指捏合缩放画布,曲线细节随缩放比例实时重绘
  4. 4点击「重置视图」按钮恢复默认缩放与中心点,曲线回到初始显示范围
  5. 5在输入框下方切换「网格/无网格」模式,画布背景在显示/隐藏坐标网格间切换

输入输出示例

输入输出说明
y = sin(x)在 [-2π, 2π] 区间显示一条标准正弦波,周期 2π,振幅 1,过原点 (0,0)。常规:最基础的周期函数,验证工具能否正确画出连续光滑曲线及周期特性。
y = x^2在 [-5, 5] 区间显示一条开口向上的抛物线,顶点在 (0,0),对称轴为 y 轴。常规:幂函数基本形态,验证二次函数对称性及顶点定位是否准确。
y = tan(x)在 [-2π, 2π] 区间显示多条渐近线(x = -3π/2, -π/2, π/2, 3π/2 等处图像断开),曲线在渐近线之间从负无穷跳变到正无穷。边界:含无穷间断点的函数,验证工具是否正确处理渐近线(不连接断点)并避免渲染错误。
y = 1/x在 [-5, 5] 区间显示两条双曲线分支,x=0 处图像断开,左侧分支在第三象限,右侧在第一象限,均趋近于 x 轴和 y 轴。边界:x=0 处为无穷间断点,验证工具是否在 x=0 处留空(不画竖直线),且左右分支正确分离。
y = sqrt(x)在 [0, 10] 区间显示一条从原点 (0,0) 开始向右上方缓慢增长的曲线,x<0 区域无图像。边界:定义域非全体实数,验证工具是否自动限制 x 取值范围,且不显示负数区域的错误图像。
y = x^x在 [0.01, 5] 区间显示一条先下降后上升的曲线,最小值约在 x=0.367 处(y≈0.692),x 接近 0 时 y 趋近于 1。易错:该函数在 x≤0 时复数域无定义,且 x 接近 0 时极限为 1,验证工具是否自动忽略负数区域,以及是否准确绘制极小值点。
y = floor(x)在 [-3, 3] 区间显示一系列水平线段,每段长度为 1,左闭右开(如 [0,1) 段 y=0,在 x=1 处跳变到 y=1),整数点处出现跳跃。易错:阶梯函数,验证工具是否在整数点处正确处理间断(不画竖直线连接),且线段端点方向(左闭右开)正确。

常见错误对照

1.三角函数用度数而非弧度

✗ 错误sin(30)
✓ 修复sin(30*pi/180) 或 sin(0.5236)

函数图像默认使用弧度制,sin(30) 不是 sin(30°),而是 sin(30 rad) ≈ -0.988。输入度数需先转换为弧度。

2.指数运算符号写错

✗ 错误y=2^3x
✓ 修复y=2^(3*x) 或 y=2^(3x)

^ 优先级低于函数调用和乘法,2^3x 被解析为 (2^3)*x = 8x,而非 2^(3x)。必须用括号明确指数范围。

3.对数底数写成下标

✗ 错误y=log2(x)
✓ 修复y=log(x)/log(2) 或 y=ln(x)/ln(2)

工具只识别 log(自然对数)和 log10(常用对数),不识别 log2 这种带底数的写法。换底公式是通用解法。

4.隐式乘法导致解析歧义

✗ 错误y=1/2x
✓ 修复y=1/(2*x) 或 y=x/2

1/2x 可能被理解为 (1/2)*x 或 1/(2x),不同解析器结果不同。本工具按从左到右结合,1/2x = 0.5x。用括号消除歧义。

5.负号与减号混淆

✗ 错误y=-3^2
✓ 修复y=(-3)^2

-3^2 被解析为 -(3^2) = -9,而不是 (-3)^2 = 9。负号优先级低于指数运算,需用括号明确负号作用域。

6.函数名拼写错误

✗ 错误y=arcsin(x)
✓ 修复y=asin(x)

工具使用标准数学函数名:asin/acos/atan 表示反三角函数,而非 arcsin/arccos/arctan。拼写错误会导致函数不被识别。

7.绝对值函数用竖线

✗ 错误y=|x|
✓ 修复y=abs(x)

竖线 | 在表达式解析中通常被当作逻辑或运算符,而非绝对值符号。必须使用 abs() 函数。

8.定义域外取值导致图像断裂

✗ 错误y=sqrt(x-2) 但 x 范围设为 -10 到 10
✓ 修复将 x 范围设为 2 到 10,或观察工具自动处理(显示空白区域)

sqrt 要求参数 ≥0,x<2 时函数无实数结果。若工具不自动裁剪,图像会在 x=2 处断裂。手动调整 x 范围可避免误导。

第三节

工作原理

How It Works

核心公式

y = f(x)

变量说明

  • x自变量,实数域内取值
  • y因变量,由 f(x) 计算得出
  • f函数规则,如 sin、x²、log

示例

输入函数 f(x) = x² − 4x + 3,取 x = 2:y = 2² − 4×2 + 3 = 4 − 8 + 3 = −1,点 (2, −1) 在抛物线上。

输入表达式y=f(x)解析函数词法/语法分析逐点采样Canvas 绘制图像展示缩放/平移视口变换重新采样重绘图像更新图像
用户输入 本地处理 输出结果
第四节

开发者集成

For Developers

5 种主流语言实现,复制即用:

import numpy as np import matplotlib.pyplot as plt def plot_function(func_str, x_min=-10, x_max=10): x = np.linspace(x_min, x_max, 1000) try: y = eval(func_str, {'__builtins__': {}}, {'x': x, 'np': np, 'sin': np.sin, 'cos': np.cos, 'tan': np.tan, 'exp': np.exp, 'log': np.log, 'sqrt': np.sqrt}) except Exception as e: print(f"Error evaluating function: {e}") return plt.figure(figsize=(8, 6)) plt.plot(x, y, label=f'y = {func_str}') plt.axhline(0, color='gray', lw=0.5) plt.axvline(0, color='gray', lw=0.5) plt.grid(True, alpha=0.3) plt.legend() plt.show() # 示例:绘制 y = sin(x) + cos(x/2) 在 [-10, 10] 区间 plot_function('sin(x) + cos(x/2)')
// 使用 Canvas 2D API 绘制函数图像(浏览器环境) function plotFunction(funcStr, canvasId, xMin = -10, xMax = 10) { const canvas = document.getElementById(canvasId); if (!canvas) { console.error('Canvas element not found'); return; } const ctx = canvas.getContext('2d'); const width = canvas.width, height = canvas.height; ctx.clearRect(0, 0, width, height); // 坐标轴映射 const xScale = width / (xMax - xMin); const yScale = height / 20; // y 范围假设 [-10, 10] const xCenter = -xMin * xScale; const yCenter = height / 2; ctx.strokeStyle = 'blue'; ctx.lineWidth = 2; ctx.beginPath(); const step = (xMax - xMin) / width; let first = true; for (let px = 0; px <= width; px++) { const x = xMin + px / xScale; let y; try { y = eval(funcStr.replace(/x/g, `(${x})`)); } catch (e) { console.warn(`Eval error at x=${x}: ${e.message}`); first = true; continue; } if (y === undefined || y === null || !isFinite(y)) { first = true; continue; } const canvasY = yCenter - y * yScale; if (first) { ctx.moveTo(px, canvasY); first = false; } else { ctx.lineTo(px, canvasY); } } ctx.stroke(); } // 示例:在 id='plot' 的 canvas 上绘制 y = sin(x) + cos(x/2) // 需 HTML 中 <canvas id="plot" width="800" height="600"></canvas> // plotFunction('Math.sin(x) + Math.cos(x/2)', 'plot');
package main import ( "fmt" "math" "os" "strconv" "strings" ) // 简易表达式求值器(仅支持 + - * / 和 math 函数) func evalSimple(expr string, x float64) (float64, error) { // 替换 x 为数值 replaced := strings.ReplaceAll(expr, "x", fmt.Sprintf("%f", x)) // 使用 go-eval 或 math 包计算,此处简化:仅演示思路 // 实际需引入 github.com/Knetic/govaluate 等库 return 0, fmt.Errorf("full eval requires external library") } func main() { if len(os.Args) < 2 { fmt.Println("Usage: go run main.go 'sin(x)+cos(x/2)'") return } funcStr := os.Args[1] fmt.Printf("Plotting: y = %s\n", funcStr) // 生成点集(示例输出到 stdout) for i := 0; i <= 100; i++ { x := -10.0 + float64(i)*0.2 y, err := evalSimple(funcStr, x) if err != nil { fmt.Fprintf(os.Stderr, "Error at x=%.2f: %v\n", x, err) continue } fmt.Printf("%.2f\t%.6f\n", x, y) } }
#!/bin/bash # 使用 gnuplot 从命令行绘制函数图像(需安装 gnuplot) # 示例:./plot.sh 'sin(x)+cos(x/2)' if [ $# -lt 1 ]; then echo "Usage: $0 'function_expression'" exit 1 fi FUNC="$1" cat <<EOF | gnuplot set terminal png size 800,600 set output 'plot.png' set xrange [-10:10] set yrange [-2:2] set grid plot $FUNC title 'y = $FUNC' with lines EOF echo "Image saved to plot.png"
use std::f64::consts; // 简单函数求值(仅支持基本运算和 math 函数) fn eval_func(expr: &str, x: f64) -> Option<f64> { // 实际需用表达式解析库如 meval // 此处仅演示结构 match expr { "sin(x)+cos(x/2)" => Some(x.sin() + (x/2.0).cos()), _ => None, } } fn main() { let func_str = "sin(x)+cos(x/2)"; println!("Plotting: y = {}", func_str); for i in 0..=100 { let x = -10.0 + i as f64 * 0.2; if let Some(y) = eval_func(func_str, x) { println!("{:.2}\t{:.6}", x, y); } else { eprintln!("Cannot evaluate at x={:.2}", x); } } }
第五节

常见问题

Q & A
我输入了 y=sin(x),但图像只显示一条直线,是不是工具坏了?

不是工具问题。最常见的原因是浏览器缩放或触发了平移,把图像移到了视野外。先点击「重置视图」或按快捷键 R 恢复默认范围(通常 x 轴 -10 到 10,y 轴 -10 到 10)。如果还是直线,检查输入是否有多余空格或全角符号,本工具只认半角运算符。

为什么我画 y=1/x 在 x=0 附近图像断开了?

这是正常的数学行为,不是工具缺陷。1/x 在 x=0 处无定义,函数图像在该点存在无穷间断。本工具采用逐点采样绘制,采样点不会恰好落在 x=0,因此两侧曲线自然断开。如果希望看到渐近线效果,可以手动添加一条 x=0 的虚线辅助线(本工具暂不支持自动标注渐近线)。

同时画 y=x^2 和 y=2^x,为什么指数函数在 x 大于某个值后突然变得特别大?

这是指数增长 vs 多项式增长的本质差异。本工具默认 y 轴范围是 -10 到 10,当 x 约大于 3.3 时,2^x 的值已经超过 10,超出视图顶部。此时可以手动调整 y 轴上限(例如改为 0 到 100),或者开启「自动缩放 y 轴」模式让工具根据当前 x 范围动态适配 y 范围。

我手机横屏时图像被截断了,怎么调?

本工具在手机上默认自适应屏幕宽度,但横屏时部分设备可能因浏览器地址栏折叠导致绘图区高度计算异常。建议刷新页面一次,或手动将设备从横屏转回竖屏再转回横屏,触发重绘。如果问题持续,可以暂时在竖屏下使用,绘图区高度足够显示常见函数的主要特征。

画 y=tan(x) 时为什么出现很多竖线?

那些竖线是采样点在间断点附近跳跃连接造成的伪影。tan(x) 在 x = (k+0.5)π 处有无穷间断,本工具采样点连续绘制时,会错误地把间断点两侧的点连起来。目前没有内置去伪影功能,建议手动在 x 轴刻度上标注间断点位置,或只关注非间断区间的图像走势。

我想看 y=log(x) 在 x 小于 0 的部分,为什么画不出来?

因为对数函数 log(x) 在实数范围内定义域是 x > 0,x ≤ 0 时函数值为复数,本工具只处理实数运算,所以不会显示。如果确实需要观察负半轴,可以尝试画 y=log(|x|) 或 y=log(x+1) 平移定义域。注意:输入 log 默认以 e 为底,如需常用对数写成 log10(x)。

这个函数图像工具和手机上的计算器画图有什么区别?

主要区别在交互和精度。手机计算器通常只画预设的简单函数(如 sin、cos),且不能自由输入复杂表达式;本工具支持任意组合函数(如 sin(x^2)+cos(e^x)),提供鼠标拖拽平移、滚轮缩放、坐标值实时显示。但手机计算器一般能离线使用,本工具需要浏览器环境,首次加载需联网获取页面资源。

我画了 y=sin(1/x) 在 x 接近 0 时图像乱成一团,是工具精度不够吗?

不是精度问题,是数学上的固有现象。sin(1/x) 在 x→0 时振荡频率无限增加,任何有限采样率的绘图工具都无法完整显示。本工具默认采样点约 500 个,在 x 接近 0 时采样间隔不足以捕捉高频振荡。可以尝试放大 x 范围到 0.1 到 1 观察趋势,或者接受这是函数本身的特性而非工具缺陷。

隐私保证所有计算与处理均在你的浏览器本地完成,输入数据不会上传服务器,也不会保存或共享。

选择 打开 +新窗口 esc关闭