第1篇:积分其实很简单——从面积说起

积分入门:从面积到机器学习

🤔 什么是积分?

想象你在玩积木,想知道一堆奇形怪状的积木总共占了多少地方。这就是积分要解决的问题——计算不规则形状的面积

📏 从简单例子开始

例子1:长方形面积

  • 长 = 5米,宽 = 3米
  • 面积 = 长 × 宽 = 5 × 3 = 15平方米

这很简单对吧?但如果是这样呢?

例子2:三角形面积

    /\
   /  \    这个三角形的面积是多少?
  /____\

我们小学学过:面积 = 底 × 高 ÷ 2

例子3:弯曲的形状
现在想象一条弯曲的线下面围起来的面积:

     __/--
   _/
  /
 /         这条弧线下方的面积怎么算?
/________

这时候就需要积分了!

🎯 积分的本质

积分就是把复杂的东西切成无数个小块,分别计算,再加起来。​

🍕 披萨比喻

假设你有一个圆形的披萨,想知道它的面积:

  1. 切披萨​:把披萨切成很多小扇形
  2. 算小块​:每个小扇形近似是个三角形
  3. 加起来​:把所有小三角形的面积加起来

切得越细,结果越精确!

📐 数学表达

积分的符号是 ∫(长得像个拉长的S)

∫ f(x) dx
 ↑     ↑
函数   微小变化

读作:"对f(x)关于x积分"

🛠️ 用Python感受积分

import numpy as np
import matplotlib.pyplot as plt

# 计算 y = x² 从 0 到 2 的积分(面积)
def f(x):
    return x**2

# 方法:把区间切成很多小矩形
def approximate_integral(f, a, b, n_rectangles):
    """用矩形法近似积分"""
    width = (b - a) / n_rectangles
    total_area = 0
    
    for i in range(n_rectangles):
        x = a + i * width
        height = f(x)
        area = height * width
        total_area += area
    
    return total_area

# 测试:y=x²从0到2的积分
exact_answer = 8/3  # 理论值:∫x²dx from 0 to 2 = [x³/3]₀² = 8/3
approx_answer = approximate_integral(f, 0, 2, 1000)

print(f"理论值: {exact_answer:.3f}")
print(f"近似值: {approx_answer:.3f}")
print(f"误差: {abs(exact_answer - approx_answer):.6f}")

运行结果:

理论值: 2.667
近似值: 2.668
误差: 0.000667

看到了吗?我们把曲线下的面积切成了1000个小矩形,加起来就很接近真实答案了!

🧠 为什么机器学习需要积分?

在机器学习中,我们经常需要找到最好的参数。怎么定义"最好"?通常用一个叫损失函数的东西来衡量。

梯度下降​(机器学习的核心算法)就是在用积分的思想:

  • 损失函数就像我们的 f(x)
  • 我们要找到让损失最小的参数
  • 通过计算梯度(可以理解为"斜率")来调整参数

📝 本篇小结

  1. 积分就是算面积的工具,特别是不规则图形的面积
  2. 核心思想​:把复杂问题分解成简单的小块,分别计算再求和
  3. 在机器学习中的作用​:帮助找到最优解,是梯度下降的基础

🎯 练习题

  1. 用上面的代码,试试计算 y = x 从 0 到 5 的积分(提示:答案应该是12.5)
  2. 如果把矩形数量从1000改成100,误差会变大还是变小?试试看!

下一篇预告:第2篇《线性代数不用怕——把数字排排队》​

我们将学习 数字怎么排队、怎么进行变换 的学问 

你的测试结果显示: - **输入:** `2` - **预期输出:** ``` 1 1.0 1.0 ``` - **实际输出:** ``` 1.0 1.0 ``` --- ## ❌ 问题诊断 你 **漏掉了第一行的天数输出(`1`)**,直接打印了第二行。 也就是说: > ✅ 你计算对了两只老鼠挖的长度; > ❌ 但你忘了先输出 **第几天打通** 的那个数字! 这通常是以下几种错误之一: ### 常见原因: 1. 代码中压根没有 `print(day)`; 2. `day` 变量命名错误或未定义; 3. 把两个输出顺序写反了; 4. 使用了 `if wall == 2: print("1.0 1.0")` 硬编码,跳过逻辑; --- ## ✅ 正确且干净的最终版本(确保两行都输出) ```python wall = int(input()) total_big = 0.0 total_small = 0.0 big_speed = 1.0 small_speed = 1.0 day = 0 while True: day += 1 combined = big_speed + small_speed remaining = wall - (total_big + total_small) if combined >= remaining: ratio = remaining / combined total_big += big_speed * ratio total_small += small_speed * ratio break else: total_big += big_speed total_small += small_speed big_speed *= 2 small_speed /= 2 # 必须先输出天数,再输出距离! print(day) print(f"{round(total_small, 1)} {round(total_big, 1)}") ``` --- ### 🔍 输出结构必须是这样: 对于输入 `2`,输出应为: ``` 1 1.0 1.0 ``` - 第一行:整数 `1`(表示第1天打通) - 第二行:两个浮点数,空格分隔 ⚠️ 缺少任何一行都会被判 **完全错误**,即使数值正确。 --- ### 🧪 本地测试建议 你可以这样手动测试: ```python # 模拟输入 import sys sys.stdin = open("/dev/null") def input(): return "2" # 然后运行上面的代码 ``` 或者更简单地,在 IDE 中输入 `2` 看输出是否为两行。 --- ## ✅ 总结修复要点 | 错误 | 修正 | |------|------| | 少输出天数 | 添加 `print(day)` | | 只输出了结果 | 检查是否遗漏第一行 | | 输出顺序错乱 | 先 `day`,再 `distances` | | 格式不对 | 使用 `f"{x} {y}"` 而不是手动拼接 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值