物理作业验证
高一学生做完自由落体位移公式 s=½gt² 的课后习题,手算结果与参考答案差 0.3 米,不确定是代入错还是概念理解偏。在工具输入函数 y=0.5*9.8*x²,拖动 x 轴滑块查看 t=2 秒时 y=19.6,与课本标准值一致,确认自己计算步骤无误。省去翻答案、问同学的等待,直接看到函数曲线与数值对应关系。
sin cos tan ln log sqrt abs ^ 与隐式乘法 2x。运算符+ - * / ^(幂,右结合)%(取模)· 一元负号 -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),渐近线处自动断笔,不绘制穿越竖线。
数学课上画 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) 显函数,含初等函数 | 支持显/隐/参数/极坐标函数 | 仅能绘制简单显函数 |
| 缩放精度 | 自由缩放,精度受屏幕像素限制 | 自由缩放,支持坐标轴锁定比例 | 受纸张/计算器分辨率限制 |
| 导出方式 | 截图或复制图像 | 截图/分享链接/嵌入代码 | 手动复制或拍照 |
| 输入 | 输出 | 说明 |
|---|---|---|
| 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^3xy=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/2xy=1/(2*x) 或 y=x/21/2x 可能被理解为 (1/2)*x 或 1/(2x),不同解析器结果不同。本工具按从左到右结合,1/2x = 0.5x。用括号消除歧义。
5.负号与减号混淆
y=-3^2y=(-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 范围可避免误导。
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) 在抛物线上。
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);
}
}
}不是工具问题。最常见的原因是浏览器缩放或触发了平移,把图像移到了视野外。先点击「重置视图」或按快捷键 R 恢复默认范围(通常 x 轴 -10 到 10,y 轴 -10 到 10)。如果还是直线,检查输入是否有多余空格或全角符号,本工具只认半角运算符。
这是正常的数学行为,不是工具缺陷。1/x 在 x=0 处无定义,函数图像在该点存在无穷间断。本工具采用逐点采样绘制,采样点不会恰好落在 x=0,因此两侧曲线自然断开。如果希望看到渐近线效果,可以手动添加一条 x=0 的虚线辅助线(本工具暂不支持自动标注渐近线)。
这是指数增长 vs 多项式增长的本质差异。本工具默认 y 轴范围是 -10 到 10,当 x 约大于 3.3 时,2^x 的值已经超过 10,超出视图顶部。此时可以手动调整 y 轴上限(例如改为 0 到 100),或者开启「自动缩放 y 轴」模式让工具根据当前 x 范围动态适配 y 范围。
本工具在手机上默认自适应屏幕宽度,但横屏时部分设备可能因浏览器地址栏折叠导致绘图区高度计算异常。建议刷新页面一次,或手动将设备从横屏转回竖屏再转回横屏,触发重绘。如果问题持续,可以暂时在竖屏下使用,绘图区高度足够显示常见函数的主要特征。
那些竖线是采样点在间断点附近跳跃连接造成的伪影。tan(x) 在 x = (k+0.5)π 处有无穷间断,本工具采样点连续绘制时,会错误地把间断点两侧的点连起来。目前没有内置去伪影功能,建议手动在 x 轴刻度上标注间断点位置,或只关注非间断区间的图像走势。
因为对数函数 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)),提供鼠标拖拽平移、滚轮缩放、坐标值实时显示。但手机计算器一般能离线使用,本工具需要浏览器环境,首次加载需联网获取页面资源。
不是精度问题,是数学上的固有现象。sin(1/x) 在 x→0 时振荡频率无限增加,任何有限采样率的绘图工具都无法完整显示。本工具默认采样点约 500 个,在 x 接近 0 时采样间隔不足以捕捉高频振荡。可以尝试放大 x 范围到 0.1 到 1 观察趋势,或者接受这是函数本身的特性而非工具缺陷。
隐私保证所有计算与处理均在你的浏览器本地完成,输入数据不会上传服务器,也不会保存或共享。