Python 解一道江苏 小升初 数学题,如此变态,看不起来谁?
作者:小小明【江湖人称"明佬"】
链接:blog.csdn.net/as604049322/article/details/118388505
注明:本文经过作者小小明授权发布,可戳原文链接关注原文作者!
本文简介
大家好,我是黄同学????
前段时间,我在群里面发布了一道题。没想到明佬
用心了,很快记下了,马上就用Python解答出来了。
题目如下:
小学题目都这么难,看不起谁呢。今天明佬将尝试通过Python来解题。
首先我们以左下角为原点建立直角坐标系,很快能够知道圆的方程为
两个扇形的方程分别为和的一部分。
上面的方程很容易得到,但要计算出方程表达式还需费一番功夫,所以下面我们打算也让Python来计算。
在解题前,我们会先用Python绘制出如下图像。
结果如下:
绘图步骤
1. 画圆
首先计算出上半圆和下半的表达式分别为:
from sympy.abc import x, y
import sympyc1, c2 = sympy.solve((x-5)**2+(y-5)**2 - 5**2, y)
display(c1)
display(c2)
结果如下:
如果想要展开表达式可以进行如下操作:
display(sympy.expand(c1))
display(sympy.expand(c2))
结果如下:
直接打印可以看到在Python的表达式:
print(str(c1))
print(str(c2))
5 - sqrt(-x*(x - 10))
sqrt(x*(10 - x)) + 5
因此利用上述文本,我们可以直接进行numpy的函数求值,下面尝试画个圆试一下:
import numpy as np
from numpy import sqrt
import matplotlib.pyplot as plt%matplotlib inlineplt.figure(figsize=(5, 5))
x = np.linspace(0, 10, 1024)plt.plot(x, eval(str(c1)), color="r")
plt.plot(x, eval(str(c2)), color="r")plt.xlim(-0.2, 10.2)
plt.ylim(-0.2, 10.2)plt.show()
结果如下:
可以看到我们求解的两个表达式可以画出圆形。
下面我们继续来画扇形。
2. 画扇形
两个扇形的方程分别为和的一部分。
首先我们计算上面的扇形的函数公式:
sympy.solve((x-10)**2+y**2 - 10**2, y)
结果如下:
[sqrt(x*(20 - x)), -sqrt(-x*(x - 20))]
显然上面的扇形的函数公式是正数,可以直接取角标为0的函数公式:
s1, _ = sympy.solve((x-10)**2+y**2 - 10**2, y)
s1
结果如下:
用同样的方法我们再求出下面的扇形:
s2, _ = sympy.solve(x**2+(y-10)**2 - 10**2, y)
s2
结果如下:
然后我们绘制函数图形验证一下:
import numpy as np
from numpy import sqrt
import matplotlib.pyplot as plt
from sympy.abc import x, y
import sympy%matplotlib inlinec1, c2 = sympy.solve((x-5)**2+(y-5)**2 - 5**2, y)
s1, _ = sympy.solve((x-10)**2+y**2 - 10**2, y)
s2, _ = sympy.solve(x**2+(y-10)**2 - 10**2, y)x = np.linspace(0, 10, 1024)plt.figure(figsize=(5, 5))
plt.plot(x, eval(str(c1)), color="r")
plt.plot(x, eval(str(c2)), color="r")plt.plot(x, eval(str(s1)), color="b")
plt.plot(x, eval(str(s2)), color="b")plt.xlim(-0.2, 10.2)
plt.ylim(-0.2, 10.2)plt.show()
结果如下:
3. 绘制阴影
首先我们需要求出四个交点。
先分清几个线各是哪条:
import numpy as np
from numpy import sqrt
import matplotlib.pyplot as plt
from sympy.abc import x, y
import sympy%matplotlib inlinec1, c2 = sympy.solve((x-5)**2+(y-5)**2 - 5**2, y)
s1, _ = sympy.solve((x-10)**2+y**2 - 10**2, y)
s2, _ = sympy.solve(x**2+(y-10)**2 - 10**2, y)x = np.linspace(0, 10, 1024)plt.figure(figsize=(5, 5))
plt.plot(x, eval(str(c1)), label="c1")
plt.plot(x, eval(str(c2)), label="c2")plt.plot(x, eval(str(s1)), label="s1")
plt.plot(x, eval(str(s2)), label="s2")plt.xlim(-0.2, 10.2)
plt.ylim(-0.2, 10.2)
plt.legend()plt.show()
结果如下:
下面分别交出交点:
from sympy.abc import x, yx1, = sympy.solve(c1-s1, x)
x2, = sympy.solve(c1-s2, x)
x3, = sympy.solve(c2-s1, x)
x4, = sympy.solve(c2-s2, x)
x1, x2, x3, x4
(15/4 - 5*sqrt(7)/4,25/4 - 5*sqrt(7)/4,5*sqrt(7)/4 + 15/4,5*sqrt(7)/4 + 25/4)
根据对称性,我们可以知道四个交点的坐标分别为(x1,x2), (x2,x1), (x3,x4),(x4,x3)
同样可以画图验证一下:
import numpy as np
from numpy import sqrt
import matplotlib.pyplot as plt
from sympy.abc import x, y
import sympy%matplotlib inlinec1, c2 = sympy.solve((x-5)**2+(y-5)**2 - 5**2, y)
s1, _ = sympy.solve((x-10)**2+y**2 - 10**2, y)
s2, _ = sympy.solve(x**2+(y-10)**2 - 10**2, y)
x1, = sympy.solve(c1-s1, x)
x2, = sympy.solve(c1-s2, x)
x3, = sympy.solve(c2-s1, x)
x4, = sympy.solve(c2-s2, x)x = np.linspace(0, 10, 1024)plt.figure(figsize=(5, 5))
plt.plot(x, eval(str(c1)), label="c1")
plt.plot(x, eval(str(c2)), label="c2")plt.plot(x, eval(str(s1)), label="s1")
plt.plot(x, eval(str(s2)), label="s2")plt.plot([x1, x2, x3, x4], [x2, x1, x4, x3], 'rx')
plt.text(x1, x2+0.1, "p1", ha="center", va="bottom")
plt.text(x2, x1+0.1, "p2", ha="center", va="bottom")
plt.text(x3, x4+0.1, "p3", ha="center", va="bottom")
plt.text(x4, x3+0.1, "p4", ha="center", va="bottom")plt.xlim(-0.2, 10.2)
plt.ylim(-0.2, 10.2)
plt.legend()
plt.show()
结果如下:
下面开始绘制阴影:
import numpy as np
from numpy import sqrt
import matplotlib.pyplot as plt
from sympy.abc import x, y
import sympy%matplotlib inlinec1, c2 = sympy.solve((x-5)**2+(y-5)**2 - 5**2, y)
s1, _ = sympy.solve((x-10)**2+y**2 - 10**2, y)
s2, _ = sympy.solve(x**2+(y-10)**2 - 10**2, y)
x1 = sympy.solve(c1-s1, x)[0].evalf()
x2 = sympy.solve(c1-s2, x)[0].evalf()
x3 = sympy.solve(c2-s1, x)[0].evalf()
x4 = sympy.solve(c2-s2, x)[0].evalf()x = np.linspace(0, 10, 1024)
c1, c2, s1, s2 = map(lambda s: eval(str(s)), (c1, c2, s1, s2))plt.figure(figsize=(5, 5))
plt.plot(x, c1, label="c1")
plt.plot(x, c2, label="c2")
plt.plot(x, s1, label="s1")
plt.plot(x, s2, label="s2")plt.fill_between(x[x <= x1], c1[x <= x1], c2[x <= x1], color="grey")
plt.fill_between(x[(x1 < x) & (x <= x3)], s1[(x1 < x) &(x <= x3)], c2[(x1 < x) & (x <= x3)], color="grey")
plt.fill_between(x[(x2 <= x) & (x <= x4)], c1[(x2 <= x) & (x <= x4)], s2[(x2 <= x) & (x <= x4)], color="grey")
plt.fill_between(x[x > x4], c1[x > x4], c2[x > x4], color="grey")plt.plot([x1, x2, x3, x4], [x2, x1, x4, x3], 'rx')plt.xlim(-0.2, 10.2)
plt.ylim(-0.2, 10.2)
plt.legend()
plt.show()
结果如下:
然后再稍微调整一下颜色即可得到文章开头的图像。
4. 绘图完整代码
import numpy as np
from numpy import sqrt
import matplotlib.pyplot as plt
from sympy.abc import x, y
import sympy%matplotlib inlinec1, c2 = sympy.solve((x-5)**2+(y-5)**2 - 5**2, y)
s1, _ = sympy.solve((x-10)**2+y**2 - 10**2, y)
s2, _ = sympy.solve(x**2+(y-10)**2 - 10**2, y)
x1 = sympy.solve(c1-s1, x)[0].evalf()
x2 = sympy.solve(c1-s2, x)[0].evalf()
x3 = sympy.solve(c2-s1, x)[0].evalf()
x4 = sympy.solve(c2-s2, x)[0].evalf()x = np.linspace(0, 10, 1024)
c1, c2, s1, s2 = map(lambda s: eval(str(s)), (c1, c2, s1, s2))plt.figure(figsize=(5, 5))
plt.plot(x, c1, label="c1", color="r")
plt.plot(x, c2, label="c2", color="r")
plt.plot(x, s1, label="s1", color="b")
plt.plot(x, s2, label="s2", color="b")plt.fill_between(x[x <= x1], c1[x <= x1], c2[x <= x1], color="grey")
plt.fill_between(x[(x1 < x) & (x <= x3)], s1[(x1 < x) &(x <= x3)], c2[(x1 < x) & (x <= x3)], color="grey")
plt.fill_between(x[(x2 <= x) & (x <= x4)], c1[(x2 <= x) & (x <= x4)], s2[(x2 <= x) & (x <= x4)], color="grey")
plt.fill_between(x[x > x4], c1[x > x4], c2[x > x4], color="grey")plt.xlim(-0.2, 10.2)
plt.ylim(-0.2, 10.2)
plt.show()
在完成图像绘制后,我们就可以通过相同的思路求积分得到面积了。
积分求解面积
最终结果完整求解代码:
from sympy.abc import x, y
from sympy import integrate
import sympyc1, c2 = sympy.solve((x-5)**2+(y-5)**2 - 5**2, y)
s1, _ = sympy.solve((x-10)**2+y**2 - 10**2, y)
s2, _ = sympy.solve(x**2+(y-10)**2 - 10**2, y)
x1 = sympy.solve(c1-s1, x)[0].evalf()
x2 = sympy.solve(c1-s2, x)[0].evalf()
x3 = sympy.solve(c2-s1, x)[0].evalf()
x4 = sympy.solve(c2-s2, x)[0].evalf()r = integrate(c2-c1, (x, 0, x1))+integrate(c2-s1, (x, x1, x3)) + \integrate(s2-c1, (x, x2, x4))+integrate(c2-c1, (x, x4, 10))
r.round(4)
结果:29.2763
如果希望得到更加精确的的结果,可以最后再调用evalf方法:
from sympy.abc import x, y
from sympy import integrate
import sympyc1, c2 = sympy.solve((x-5)**2+(y-5)**2 - 5**2, y)
s1, _ = sympy.solve((x-10)**2+y**2 - 10**2, y)
s2, _ = sympy.solve(x**2+(y-10)**2 - 10**2, y)
x1 = sympy.solve(c1-s1, x)[0]
x2 = sympy.solve(c1-s2, x)[0]
x3 = sympy.solve(c2-s1, x)[0]
x4 = sympy.solve(c2-s2, x)[0]r = integrate(c2-c1, (x, 0, x1))+integrate(c2-s1, (x, x1, x3)) + \integrate(s2-c1, (x, x2, x4))+integrate(c2-c1, (x, x4, 10))
r.evalf()
结果:29.2762519060696
往
期
回
顾
资讯
GitHub的AI编程代码漏洞40%
资讯
AI复活她,OpenAI又夺走她
资讯
英伟达用 AI 给自家纪录片配音
转载
人脸识别模型的动手实践!
分享
点收藏
点点赞
点在看
Python 解一道江苏 小升初 数学题,如此变态,看不起来谁?相关推荐
- Python求解江苏小升初数学题与图像阴影绘制
大家好,我是小小明. 前面我已经用Python求积分解决了一道小学数学题,详见:Python神器可以拯救小学数学题不会做 结果今天又碰到一道更难的,题目如下: 今天我们将尝试尽量多的通过Python来 ...
- 无锡小升初数学题求阴影面积
无锡小升初数学题求阴影面积 思路 需要的知识范围:三角函数,反三角函数(计算器),一元二次方程 求角度–>求扇形面积 求三条边–>求三角面积 相加相减 matlab代码 clear sym ...
- python解初中题_用python解一道数独小题
个人的第一篇博文,还请多多支持,不当之处,还请多多指教.(以后有精力还会写更多的文章) 本人是一名大一狗,目前为止学了半年python,对python也就有一点点的了解,没事爱编写一些小程序玩,不过都 ...
- 说句心里话python怎么写_说句心里话小升初满分作文
导读:小编根据大家的需要整理了一份关于<说句心里话小升初满分作文>的内容,具体内容: 相信每个人都有自己的心里话,我也有.下面是小编为大家精心整理的关于,希望能够帮助到你们. 说句心里话 ...
- 北京小学 计算机派位,北京小升初电脑派位原理详解!和对口直升入学有什么区别?...
➤北京小升初什么是电脑派位? 电脑派位是北京各区小升初入学途径中统一使用的,决定孩子进入哪所学校的方法,并不是一种单一的入学途径.电脑派位是目前符合北京小升初中就近入学原则下的一种做法. ➤北京小升初 ...
- 南外计算机课,南外小升初,怎么考?
冲外,是身处南京城的家长们绕不过去的话题. 全国那么多所外国语学校,但百度"冲外",会发现这个"外",特指南外. 可别说,在"冲外"这一点上 ...
- 两个数相乘积一定比每个因数都大_小升初数学知识点大全含公式+20类必考应用题(含答案解析),孩子考试一定用得上!...
小升初数学知识点大全含公式 一.几何图形周长.面积和体积公式* 三角形的面积=底×高÷2.S= a×h÷2 正方形的面积=边长×边长 S= a² 长方形的面积=长×宽 公式 S= a×b 平行四边形的 ...
- # 根据三边求角度_小升初数学必学的10种图形求面积法,你家娃都会了吗?
从小学到初中再到高中,在数学图形方面,我们会从平面思维逐步转向立体思维.如果想要练就强大的逻辑思维能力,必须要把前面的基础知识掌握牢固,才能灵活运用.接下来让我们看一下小升初需要掌握哪些关于图形的数学 ...
- 小升初数学暑假班招生中
三行科创小升初数学暑假班 招生对象:5-6年级 授课时间:8.1~8.25每晚19:00-20:30 授课方式:钉钉教室直播 课程内容安排 1,带余除法 2,最大公因数 3,最小公倍数 4,比与比例 ...
最新文章
- ubuntu20输入法qiehuan_ubuntu20.04中文输入法安装步骤
- DNS解析与Bind的使用(2)
- ajax jquery return没有返回值
- java并发包消息队列
- hybris使用impEx导入产品主数据的示例脚本
- roku能不能安装软件_如何阻止假期更改Roku主题
- tf.train.Saver
- html页面li节点排序,排序DOM节点的最简单方法?
- ztree局部刷新节点_神经网络训练的世界记录是怎样被刷新的 -- 总结分布式训练的计算场景...
- nowcoder80D applese的生日
- EF Core 小工具
- IIS网站本机可以访问但局域网其他机器无法访问 解决方法
- 如何批量将 Word 文档转为 XPS 格式
- ExpandableListView说明及其用法
- C++相关问题笔记(一)
- 女生到社会上会遇到比学校更优秀的男生,而男生很难找到比在学校更好的女生。是吗?
- 推广那些坑,做好渠道组合拳!
- VMwares设置共享文件夹
- 支付宝小程序JS省市区三级联动
- 数美科技的智能文本审核能为社交行业带来什么价值 | 数美人工智能研究院