温故知新,数学之美,以毕达哥拉斯为线索,告诉你数学从猜想到定理再到应用的全过程
什么是勾股定理
勾股定理(Pythagoras theorem
)(又称毕达哥拉斯定理
)是几何学中一个基本且重要的定理,主要应用于直角三角形。该定理描述了直角三角形三个边之间的关系。
定理内容
在一个直角三角形中,直角两边的平方和等于斜边的平方。用数学公式表示为
示例代码
- 使用
Math.Sqrt
方法计算斜边的长度。 - 根据勾股定理,斜边c等于两直角边a和b的平方和的平方根。
using System;
namespace PythagoreanTheorem
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("勾股定理计算器");
// 输入第一条直角边
Console.Write("请输入第一条直角边的长度(a):");
double a = ReadPositiveDouble();
// 输入第二条直角边
Console.Write("请输入第二条直角边的长度(b):");
double b = ReadPositiveDouble();
// 计算斜边
double c = Math.Sqrt(a * a + b * b);
Console.WriteLine($"\n根据勾股定理,斜边的长度(c)为:{c:F2}");
}
/// <summary>
/// 读取用户输入的正数并进行验证
/// </summary>
/// <returns>有效的正数</returns>
static double ReadPositiveDouble()
{
double value;
while (true)
{
string input = Console.ReadLine();
if (double.TryParse(input, out value) && value > 0)
{
return value;
}
else
{
Console.Write("输入无效,请输入一个正数:");
}
}
}
}
}
这里还可以引入扩展
public static class DoubleExtensions
{
/// <summary>
/// 计算双精度数的平方
/// </summary>
/// <param name="number">输入数</param>
/// <returns>平方值</returns>
public static double Square(this double number)
{
return number * number;
}
}
这样就可以简化成
// 计算斜边
double c = Math.Sqrt(a.Square() + b.Square());
在中国的历史
据汉朝的数学书《周髀算经》的记载,早在公元前1000年的时候,周公和商高这两个人就谈到了“勾三股四弦五”。他们的年代比毕达哥拉斯早,因此教科书中讲是中国人商高最早提出这个定理的,于是称之为勾股定理或者商高定理。
《周髀算经》 是中国最早记录勾股定理的数学经典之一,成书于西周晚期(约公元前1046年至公元前771年)。该书不仅涉及天文学和历法,还包含了丰富的几何知识,其中明确描述了勾股定理的应用。
在《周髀算经》中,勾股定理被称为“勾股弦长”或“勾股定理”。书中使用了勾股作为直角三角形两条直角边的名称,“勾”对应于一条直角边,“股”对应于另一条直角边,而“弦”则对应于斜边。其描述方式与西方的勾股定理非常相似,即在直角三角形中,两直角边的平方和等于斜边的平方。
在世界的历史
-
《巴比伦数学砖》:大约公元前1800年至前1600年间的巴比伦泥板中,记录了一些与勾股定理相关的数学问题。这些问题涉及直角三角形的边长关系,显示出巴比伦数学家对勾股定理的理解,巴比伦人利用勾股定理进行土地划分和测量,确保边界的准确性。
-
《莱因德数学纸草书》:大约公元前2000年至前1800年间的埃及数学文献中,包含了一些与勾股定理类似的几何计算方法,尤其是在测量和建筑方面。埃及人建造金字塔时,使用几何方法确保其对称性和稳定性,可能应用了类似勾股定理的原理。
-
《俾舍数学》(《Baudhayana Sulba Sutra》):约公元前800年左右,古印度的《俾舍数学》文献中明确描述了勾股定理。该文献用于指导祭祀活动中的祭坛建造,确保祭坛的几何准确性。
-
毕达哥拉斯学派:毕达哥拉斯(约公元前570年-前495年)及其学派系统化了勾股定理,明确提出并证明了这一几何定理,使其成为西方数学的基础之一。
数学定理确立的过程
古埃及和美索不达米亚文明虽然掌握了类似勾股定理的几何知识,但由于文化背景、数学发展目标以及历史记录的原因,他们并未像古希腊那样争夺或标榜这一定理的“发现权”。在这些文明中,数学主要用于实用领域,并没有系统地进行理论化和证明,因此不太可能产生类似于“优先发现权”或个人荣誉的观念。
相比之下,古希腊文明对抽象理论和逻辑证明的重视,使他们更加关注定理的系统化和个人的贡献。正因为此,毕达哥拉斯和欧几里得等希腊数学家在历史上获得了与勾股定理相关的荣誉。
几何学源于古埃及,当地人出于农业生产的考虑,对天文和土地进行度量,发明了几何学。但是,度量出来的几何其实和真正的数学还有很大的差距。
比如说,古代文明的人们确实观察到勾股数的现象,他们画一个直角三角形,勾三尺长、股四尺长时,弦长恰好就是五尺长,于是就有了勾三股四弦五的说法。
在数学上,观察的经验可以给我们启发,但是它不能成为我们得到数学结论的依据,数学上的结论只能从定义和公理出发,使用逻辑严格证明得到,不能通过经验总结出来。
讲回到勾股定理,一个工匠注意到勾三股四弦五这个现象,和提出一个具有普遍意义的定理是两回事。
在自然科学中,一个假说通过实验证实,就变成了定律。比如说与牛顿同时代英国的大科学家波义耳同法国科学家马略特一同发现:一个封闭容器中气体的压强和体积成反比。这很好理解,因为体积压得越小,内部的压强肯定越大。这两个人通过很多实验,都证实了这件事,于是这个定律就由他们两个人的名字命名了。
事实上,今天几乎所有的自然科学的定律和理论,不仅存在一个被推翻的可能性,而且有很多的例外。比如,证实引力波的实验,也只能保证99.9999%的可能性结论是对的。
但是,在数学上,用实验来验证一个假说(在数学上常常被称为猜想)是不被允许的。
数学的结论只能从逻辑出发,通过归纳或者演绎得出来。它必须完全正确,没有例外,因为但凡有一个例外(也被称为反例),就要被完全否定掉。这里面最著名的例子就是哥德巴赫猜想。数学世界和测量世界第二个区别就是,数学理论必须要证明,保证没有例外。
为什么数学要那么严格,它的定理为什么不能有任何例外,数学上的每一个定理都是一块基石,后人需要在此基础上往前走,试图建立一块新的基石,然后数学的大厦就一点点建成了。在这个过程中不能有丝毫的缺陷,一旦有,整个数学大厦就轰然倒塌了。
以勾股定理为例,它的确立,其实教会了人们在平面计算距离的方法,在此基础之上,三角学才得以建立,笛卡尔的解析几何才得以确立,再往上才能建立起微积分等数学工具。
如果出现了一个违反毕达哥拉斯定理的反例,不仅是这个定理失效了,而且整个数学就完蛋了,我们的科技也就时灵时不灵了。因此,数学上的每一个定理,必须也只能通过逻辑推演来证明,用多少实例来验证都没有用。
理解了数学定理确立的过程,以及它随后产生的巨大影响,我们就清楚定理和定理证明在数学中的重要性了。正是因为这个原因,西方才将这个定理命名为毕达哥拉斯定理,以彰显他的贡献。是他明确提出这个定理,并且严格地证明了它,从此毕达哥拉斯定理才成为了数学上普遍的规律。
数学和自然科学不同,它不相信测量,不是建立在实证基础之上,而是建立在逻辑基础之上的。数学也不接受大部分情况正确,但是包含例外的定理。这样整个数学大厦的基础才得以稳固。
数学定理确立的过程大致是这样的,一开始可能只是大家注意到几个特例,然后发现很多例证提出猜想,猜想经过证明就成为了定理,定理会有推论,在此基础上,会有新的定理和应用。
应用示例-计算两点之间直线距离
当在同一个坐标系里,已知点a的坐标是x1, x2; 已知点b的坐标是x2, y2; 那么我们怎么才能知道点a和点b之间的直线距离是多少呢?
如上图所示,当我们把点a和点b都放在同一坐标系中时,沿坐标轴x、y分别做虚线,会相交得到一个直角,此时,我们需要知道的两点之间直线距离就是,这条斜边c,这样一个关系刚好就构成了一个勾股定理的几何模型。
此时的,勾等于x2- x1,股等于y2- y1,那么两点之间的距离就是弦的数值。
internal class Program
{
static void Main(string[] args)
{
Console.WriteLine("两点直线距离计算器");
// 输入第一个点a的x坐标
Console.Write("请输入第一个点a的x坐标数值(x1):");
double x1 = ReadPositiveDouble();
// 输入第一个点a的y坐标
Console.Write("请输入第一个点a的y坐标数值(y1):");
double y1 = ReadPositiveDouble();
// 输入第二个点b的x坐标
Console.Write("请输入第二个点b的x坐标数值(x2):");
double x2 = ReadPositiveDouble();
// 输入第二个点b的y坐标
Console.Write("请输入第二个点b的y坐标数值(y2):");
double y2 = ReadPositiveDouble();
var x = Math.Abs(x2 - x1);
Console.WriteLine($"x2 - x1的数值(x):{x:F2}");
var y = Math.Abs(y2 - y1);
Console.WriteLine($"y2 - y1的数值(y):{y:F2}");
// 计算斜边
double c = Math.Sqrt(x.Square() + y.Square());
Console.WriteLine($"\n根据勾股定理,两点直线距离(c)为:{c:F2}");
}
/// <summary>
/// 读取用户输入的双精度整数并进行验证
/// </summary>
/// <returns>有效的双精度整数</returns>
static double ReadPositiveDouble()
{
double value;
while (true)
{
string input = Console.ReadLine();
if (double.TryParse(input, out value))
{
return value;
}
}
}
}
另外,如果是三维空间的话,还需要考虑z轴上的差异。
C#中数学支持
常量
1、自然对数的底(Math.E)
由常数e
指定
public const double E = 2.7182818284590451;
Console.WriteLine("Math.E");
Console.WriteLine(Math.E);
2、圆的周长与其直径的比值(Math.PI)
由常数π
指定
public const double PI = 3.1415926535897931;
Console.WriteLine("Math.PI");
Console.WriteLine(Math.PI);
3、一转中的弧度数(Math.Tau)
由常量τ
指定
public const double Tau = 6.2831853071795862;
Console.WriteLine("Math.Tau");
Console.WriteLine(Math.Tau);
方法
1、求数字的绝对值(Math.Abs)
Console.WriteLine(Math.Abs(Math.PI));
Console.WriteLine(Math.Abs(-Math.PI));
2、求余弦值为指定数字的角度(Math.Acos)
public static double Acos (double d);
Console.WriteLine(Math.Acos(0.5));
d
必须大于或等于-1
但小于或等于1
3、求指定数字的平方根(Math.Sqrt)
public static double Sqrt (double d);
Console.WriteLine(Math.Sqrt(2));
4、求两个指定数字中的较大值(Math.Max)
public static double Max (double val1, double val2);
Console.WriteLine(Math.Max(2.2, 3.8));
5、求两个数字中较小的一个(Math.Min)
public static decimal Min (decimal val1, decimal val2);
Console.WriteLine(Math.Min(2.2, 3.8));
6、求指定角度的正切值(Math.Tan)
public static double Tan (double a);
Console.WriteLine(Math.Tan(2.3));
7、求指定角度的正弦值(Math.Sin)
public static double Sin (double a);
Console.WriteLine(Math.Sin(2.3));
8、求指定数字的指定次幂(Math.Pow)
public static double Pow (double x, double y);
Console.WriteLine(Math.Pow(2,3));
x为要乘幂的双精度浮点数;y为指定幂的双精度浮点数;
9、求指定数字以2为底的对数(Math.Log2)
public static double Log2 (double x);
Console.WriteLine(Math.Log2(2));
10、求指定数字以10为底的对数(Math.Log10)
public static double Log10 (double x);
Console.WriteLine(Math.Log10(1));
11、求指定数字的对数(Math.Log)
public static double Log (double a, double newBase);
public static double Log (double a);
Console.WriteLine(Math.Log(2,2));
Console.WriteLine(Math.Log(2));
12、求指定角度的余弦值(Math.Cos)
public static double Cos (double d);
Console.WriteLine(Math.Cos(2.3));
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
2022-10-15 乘风破浪,遇见最佳跨平台跨终端框架.Net Core/.Net生态 - 浅析ASP.NET Core领域驱动设计,通过MediatR中介者模式实现CQRS和领域事件
2021-10-15 乘风破浪,遇见最美Windows 11之系统官宣壁纸(Wallpaper) - Insider七周年纪念壁纸(4K)