大家好,我是小小明。

前面我已经用Python求积分解决了一道小学数学题,详见:Python神器可以拯救小学数学题不会做

结果今天又碰到一道更难的,题目如下:

今天我们将尝试尽量多的通过Python来解题。

首先我们以左下角为原点建立直角坐标系,很快能够知道圆的方程为 ( x − 5 ) 2 + ( y − 5 ) 2 = 5 2 (x-5)^2+(y-5)^2=5^2 (x−5)2+(y−5)2=52

两个扇形的方程分别为 ( x − 10 ) 2 + y 2 = 1 0 2 (x-10)^2+y^2=10^2 (x−10)2+y2=102和 x 2 + ( y − 10 ) 2 = 1 0 2 x^2+(y-10)^2=10^2 x2+(y−10)2=102的一部分。

上面的方程很容易得到,但要计算出方程表达式还需费一番功夫,所以下面我们打算也让Python来计算。

在解题前,我们会先用Python绘制出如下图像:

绘图步骤

画圆

首先计算出上半圆和下半的表达式分别为:

from sympy.abc import x, y
import sympyc1, c2 = sympy.solve((x-5)**2+(y-5)**2 - 5**2, y)
display(c1)
display(c2)

结果:

5 − − x ( x − 10 ) \displaystyle 5 - \sqrt{- x \left(x - 10\right)} 5−−x(x−10) ​

x ( 10 − x ) + 5 \displaystyle \sqrt{x \left(10 - x\right)} + 5 x(10−x) ​+5

如果想要展开表达式可以进行如下操作:

display(sympy.expand(c1))
display(sympy.expand(c2))

结果:

5 − − x 2 + 10 x \displaystyle 5 - \sqrt{- x^{2} + 10 x} 5−−x2+10x ​

− x 2 + 10 x + 5 \displaystyle \sqrt{- x^{2} + 10 x} + 5 −x2+10x ​+5

直接打印可以看到在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()

可以看到我们求解的两个表达式可以画出圆形。

下面我们继续来画扇形:

画扇形

两个扇形的方程分别为 ( x − 10 ) 2 + y 2 = 1 0 2 (x-10)^2+y^2=10^2 (x−10)2+y2=102和 x 2 + ( y − 10 ) 2 = 1 0 2 x^2+(y-10)^2=10^2 x2+(y−10)2=102的一部分。

首先我们计算上面的扇形的函数公式:

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

结果:

x ( 20 − x ) \displaystyle \sqrt{x \left(20 - x\right)} x(20−x) ​

用同样的方法我们再求出下面的扇形:

s2, _ = sympy.solve(x**2+(y-10)**2 - 10**2, y)
s2

结果:

10 − 100 − x 2 \displaystyle 10 - \sqrt{100 - x^{2}} 10−100−x2 ​

然后我们绘制函数图形验证一下:

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()

绘制阴影

首先我们需要求出四个交点。

先分清几个线各是哪条:

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()

然后再稍微调整一下颜色即可得到文章开头的图像:

绘图完整代码

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(8)

结果:29.27625191

如果希望得到更加精确的的结果,可以最后再调用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)
x2, = sympy.solve(c1-s2, x)
x3, = sympy.solve(c2-s1, x)
x4, = sympy.solve(c2-s2, x)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

Python求解江苏小升初数学题与图像阴影绘制相关推荐

  1. Python 解一道江苏 小升初 数学题,如此变态,看不起来谁?

    作者:小小明[江湖人称"明佬"] 链接:blog.csdn.net/as604049322/article/details/118388505 注明:本文经过作者小小明授权发布,可 ...

  2. 无锡小升初数学题求阴影面积

    无锡小升初数学题求阴影面积 思路 需要的知识范围:三角函数,反三角函数(计算器),一元二次方程 求角度–>求扇形面积 求三条边–>求三角面积 相加相减 matlab代码 clear sym ...

  3. 说句心里话python怎么写_说句心里话小升初满分作文

    导读:小编根据大家的需要整理了一份关于<说句心里话小升初满分作文>的内容,具体内容: 相信每个人都有自己的心里话,我也有.下面是小编为大家精心整理的关于,希望能够帮助到你们. 说句心里话 ...

  4. 南外计算机课,南外小升初,怎么考?

    冲外,是身处南京城的家长们绕不过去的话题. 全国那么多所外国语学校,但百度"冲外",会发现这个"外",特指南外. 可别说,在"冲外"这一点上 ...

  5. 分享30个小升初简历模板,总有一款适合您

    分享30个小升初简历模板,总有一款适合您 30小升初简历模板下载链接:https://pan.baidu.com/s/15jkgQdLiCa24pz6bh0CoNA?pwd=65rj  提取码:65r ...

  6. 2019小升初择校之昆山娃

    文章目录 2019昆山娃小升初择校 上岸 忆往 分享 2019昆山娃小升初择校 上岸 苏州小升初基本已经进入尾声了,我想大部分择校的家长已经定下了心仪的学校.目前只剩下伟长1这颗最亮的星星,这个自从简 ...

  7. 经历小升初择校,我明白了几个道理

    经历小升初择校,我明白了几个道理 1,在优质公立学校眼里,私立学校基本都是野鸡学校!笔者去苏州园区姑苏区和吴中区好几所知名中学投递孩子的简历,试图为孩子争取到这些学校的面试/考试机会.不爽的是,对方开 ...

  8. 2015年计算机初中,2015北京小升初电脑派位解读

    小升初派位指的是大派位,也就是电脑派位:本着就近入学的原则,电脑将符合某一中学要求的区域小学内学生的序号排列后,由学生或家长代表摇出起始号和间隔号,然后由电脑直接派位抽选出进入这一中学的学生. 什么是 ...

  9. 负数比较大小_小升初总复习第七个基础模块:负数的认识

    今天我们开始第七个基础模块的复习:负数的认识 负数的认识一共分为3个知识考点. 第一,正负数的意义 以前我们学过的6,10,7,85.....这样大于0的数叫做正数.正数前面也可以 加"+& ...

最新文章

  1. pycharm goland clion 修改注释颜色
  2. 关于日志文件的一些处理
  3. k8s安装之Linux centos7升级内核到4.18以上
  4. Vue——整合Katex
  5. Django 之 Cookie判断是否已登陆(写成类)
  6. spring的controller是单例模式,但是是多线程,各个线程之间不影响
  7. extern 使用方法具体解释
  8. 吞吐量(TPS)、QPS、并发数、响应时间(RT)
  9. ON1 photo raw 2021(ps/lr滤镜插件) 下载及安装
  10. linux5 syscall 流程_Linux的上的程序是如何运行的,api机制是怎么样?
  11. 3.业务架构·应用架构·数据架构实战 --- 战略驱动的业务架构设计
  12. 超级终端连接华为交换机_Win8系统如何使用超级终端连接华为交换机?
  13. 想知道直销银行账户吗?
  14. 刚从阿里、头条面试回来,java处理excel文件数据
  15. sapi 实现语音朗读
  16. 蓄电池基础知识安培小时AH和放电速率HR
  17. mysql 在当前时间上加几小时
  18. 同质图,异质图以及属性图
  19. asp.net response.ContentType 下载文件的四种方法
  20. TGA文件内部格式详解(转)

热门文章

  1. 小学生html教程,小学.html
  2. 山东省农村信用计算机社考试,山东省农村信用社计算机专业考试题.doc
  3. Qt调试器出现:the selected debugger may be inappropriate for the inferior的解决方案
  4. Android USB Tethering的实现以及代码流程
  5. python库numpy使用技巧(一)——提取数组中非零元素
  6. 以优质氘代产品为刃,劈开生物原材料市场壁垒
  7. Python PEP8 代码规范常见问题及解决方法
  8. 大连海事大学计算机20考研(计算机应用 技术)专硕410+经验贴
  9. AWL词汇 Academic Word List (1)
  10. 如果你不了解 python 的学习体系?来看看这篇博客吧 ,特邀嘴强擦哥做点评|Python技能树测评