设为首页|收藏本站|
开启左侧

[问答] 第三单元 用python学习微积分(二十二)功、平均值、概率 ...

[复制链接]
84546 0
酹月誰邊 发表于 2022-4-11 15:07:04 | 只看该作者 打印 上一主题 下一主题
 
本文内容来自于学习麻省理工学院公开课:单变量微积分-数值积分-网易公开课
用python解方程组_星-耀的博客-CSDN博客_python解方程组
做功_百度百科
首先老师阐释了这个: 热量 = 能量 = 做功
热量的单位有千卡(kcal)  能量的单位有 千瓦时( kwh ) 做功的单位有焦耳( j )

第三单元 用python学习微积分(二十二)功、平均值、概率 ... 第1张图片



一、概率的经典问题,投飞标问题, 问如果一个人向靶心投飞镖,击中的次数与  (c是常数,假设为1)成正比,
有多大的概率会射到靶子旁边的人。至于这个计算有没有实际意义呢?这里老师提到,二战时有人研究德国的V-2导弹瞄准伦敦发射,会击中哪里,用的就是这个函数 (结果相近!)。
这里击中的概率与距离靶心的长度 r 相关,类正态分布
from sympy import *
import numpy as np
from scipy.optimize import fsolve
import matplotlib.pyplot as plt

fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)
ax.spines['left'].set_position('zero')
ax.spines['bottom'].set_position('zero')
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
ax.xaxis.set_ticks_position('bottom')
ax.yaxis.set_ticks_position('left')
ax.set_aspect(1)

def DrawXY(xFrom,xTo,steps,expr,color,label,plt):
    yarr = []
    xarr = np.linspace(xFrom ,xTo, steps)
    for xval in xarr:
        yval = expr.subs(x,xval)
        yarr.append(yval)
    y_nparr = np.array(yarr)
    plt.plot(xarr, y_nparr, c=color, label=label)   

def DrawInt(xFrom,xTo,steps,expr,color,plt, label=''):
    if(xFrom < 0 and xTo < 0):
        DrawIntNegative(xFrom,xTo,steps,expr,color,plt, label)
    else:
        if(xFrom > 0 and xTo > 0):
            DrawIntPostive(xFrom,xTo,steps,expr,color,plt, label)
        else:
            DrawIntNegative(xFrom,0,steps,expr,color,plt, label)
            DrawIntPostive(0,xTo,steps,expr,color,plt, label)
   
def DrawIntNegative(xFrom1,xTo1,steps,expr,color,plt, label=''):
    xFrom = 0 - xTo1
    xTo = 0 - xFrom1
    width = (xTo - xFrom)/steps
    xarr = []
    yarr = []
    area = 0
    xprev = xFrom
    yvalAll =  0
    xarr.append(0)
    yarr.append(0)
    for step in range(steps):
        yval = expr.subs(x,xprev)
        area += width * yval
        xarr.append(0-xprev)
        yarr.append(0-area)
        xprev= xprev + width
    plt.plot(xarr, yarr, c=color, label =label)
   
def DrawIntPostive(xFrom,xTo,steps,expr,color,plt, label=''):
    width = (xTo - xFrom)/steps
    xarr = []
    yarr = []
    area = 0
    xprev = xFrom
    yvalAll =  0
    xarr.append(0)
    yarr.append(0)
    for step in range(steps):
        yval = expr.subs(x,xprev)
        area += width * yval
        xarr.append(xprev)
        yarr.append(area)
        xprev= xprev + width
    plt.plot(xarr, yarr, c=color, label =label)
   


def DrawParabola(xFrom,xTo,steps,expr,color,plt, label=''):
    width = (xTo - xFrom)/steps
    xarrRect = []
    yarrRect = []
    area = 0
    xprev = xFrom
    yvalAll =  0
    for step in range(int(steps/2)):
        x1 = xprev
        x2 = xprev+width
        x3 = xprev+width+width
        y1 = expr.subs(x,x1)
        y2 = expr.subs(x,x2)
        y3 = expr.subs(x,x3)
        
        def solveFuncsInDrawParabola(paramlist):
            a,b,c =paramlist[0],paramlist[1],paramlist[2]
            return [a*x1**2+b*x1+c-y1,
                     a*x2**2+b*x2+c-y2,
                     a*x3**2+b*x3+c-y3]
        s=fsolve(solveFuncsInDrawParabola,[0,0,0])
        a,b,c = s[0],s[1],s[2]
        expr1 = a*x**2+b*x+c
        DrawXY(x1,x3,20,expr1,color,'',plt)
        xarrRect.append(x1)
        xarrRect.append(x1)
        xarrRect.append(x3)
        xarrRect.append(x3)
        yarrRect.append(y1)
        yarrRect.append(0)
        yarrRect.append(0)
        yarrRect.append(y3)
        area += 2*width * (y1+4*y2 + y3)/6
        plt.plot(xarrRect, yarrRect, c=color, label = '')  
        plt.plot([x2,x2], [0,y2], 'gray', label = '')  
        
        xprev = x3
    print('============================')   
    if len(label)!=0:
        print(label)   
    print('============================')
    print('width = ', width)
    print('area = ',area)
    areaFinal = (integrate(expr, (x,xFrom,xTo)))
    print ('area final = ',areaFinal)
    print ('ave final = ', areaFinal / (xTo - xFrom))

        
        

def DrawTrapezoidal(xFrom,xTo,steps,expr,color,plt, label=''):
    width = (xTo - xFrom)/steps
    xarrRect = []
    yarrRect = []
    area = 0
    xprev = xFrom
    yvalAll =  0
    for step in range(steps):
        yval1 =expr.subs(x,xprev)
        yval2 = expr.subs(x,xprev + width)
        xarrRect.append(xprev)
        xarrRect.append(xprev)
        xarrRect.append(xprev + width)
        xarrRect.append(xprev + width)
        xarrRect.append(xprev)
        yarrRect.append(0)
        yarrRect.append(yval1)
        yarrRect.append(yval2)
        yarrRect.append(0)
        yarrRect.append(0)
        area += width * (yval1+yval2)/2
        plt.plot(xarrRect, yarrRect, c=color)   
        xprev= xprev + width
    print('============================')   
    if len(label)!=0:
        print(label)   
    print('============================')
    print('width = ', width)
    print('area = ',area)
    areaFinal = (integrate(expr, (x,xFrom,xTo)))
    print ('area final = ',areaFinal)
    print ('ave final = ', areaFinal / (xTo - xFrom))
        
def DrawRects(xFrom,xTo,steps,expr,color,plt, label=''):
    width = (xTo - xFrom)/steps
    xarrRect = []
    yarrRect = []
    area = 0
    xprev = xFrom
    yvalAll =  0
    for step in range(steps):
        yval = expr.subs(x,xprev + width)
        xarrRect.append(xprev)
        xarrRect.append(xprev)
        xarrRect.append(xprev + width)
        xarrRect.append(xprev + width)
        xarrRect.append(xprev)
        yarrRect.append(0)
        yarrRect.append(yval)
        yarrRect.append(yval)
        yarrRect.append(0)
        yarrRect.append(0)
        area += width * yval
        plt.plot(xarrRect, yarrRect, c=color)   
        xprev= xprev + width
        yvalAll += yval
    print('============================')   
    if len(label)!=0:
        print(label)   
    print('============================')
    print('width = ', width)
    print('ave = ', yvalAll / steps)
    print('area = ',area)
    areaFinal = (integrate(expr, (x,xFrom,xTo)))
    print ('area final = ',areaFinal)
    print ('ave final = ', areaFinal / (xTo - xFrom))

def TangentLine(exprY,x0Val,xVal):
    diffExpr = diff(exprY)
    x1,y1,xo,yo = symbols('x1 y1 xo yo')
    expr = (y1-yo)/(x1-xo) - diffExpr.subs(x,x0Val)
    eq = expr.subs(xo,x0Val).subs(x1,xVal).subs(yo,exprY.subs(x,x0Val))
    eq1 = Eq(eq,0)
    solveY = solve(eq1)
    return xVal,solveY

def DrawTangentLine(exprY, x0Val,xVal1, xVal2, clr, txt):
    x1,y1 = TangentLine(exprY, x0Val, xVal1)
    x2,y2 = TangentLine(exprY, x0Val, xVal2)
    plt.plot([x1,x2],[y1,y2], color = clr, label=txt)
   
def Newton(expr, x0):
    ret = x0 - expr.subs(x, x0)/ expr.diff().subs(x,x0)
    return ret

def DrawText(x,y, text, fsize=9, clr = 'black'):
    plt.text(x,y, text, fontsize=fsize, color=clr)

c = 1   
x = symbols('x')
expr = c*((np.e)**(-x**2))

DrawXY(-2,2,100,expr,'blue','c*((np.e)**(-x**2))',plt)
plt.plot([1,1],[0,expr.subs(x, 1)], 'red', label='r1')
plt.plot([1.5,1.5],[0,expr.subs(x, 1.5)], 'green', label='r2')

plt.legend(loc='lower left')
plt.show()
第三单元 用python学习微积分(二十二)功、平均值、概率 ... 第2张图片
上图蓝色曲线围绕 y 轴旋转一周可以形成击中靶子的概率模型,而我们需要考虑的则是r1到r2之间的部分。
看看顶视图(从上向下看)
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)
ax.spines['left'].set_position('zero')
ax.spines['bottom'].set_position('zero')
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
ax.xaxis.set_ticks_position('bottom')
ax.yaxis.set_ticks_position('left')
ax.set_aspect(1)
x = symbols('x')

expr = (1 - x**2)**0.5

DrawXY(-1,1,100,expr,'red','r1',plt)

expr = -(1 - x**2)**0.5
DrawXY(-1,1,100,expr,'red','',plt)


expr1 = (1.5*1.5 - x**2)**0.5

DrawXY(-1.5,1.5,100,expr1,'green','r2',plt)

expr1 = -(1.5*1.5 - x**2)**0.5
DrawXY(-1.5,1.5,100,expr1,'green','',plt)

plt.legend(loc='lower left')
plt.show()


这里我给的c=1,老师说这个常量等于几并不重要,因为会被消掉....

第三单元 用python学习微积分(二十二)功、平均值、概率 ... 第3张图片

想象蓝色曲线绕y轴旋转, 左侧前视图,右侧顶视图

使用壳层法计算r1到r2之间的体积: 第三单元 用python学习微积分(二十二)功、平均值、概率 ... 第4张图片
这里老师一眼看出答案: 第三单元 用python学习微积分(二十二)功、平均值、概率 ... 第5张图片

第三单元 用python学习微积分(二十二)功、平均值、概率 ... 第6张图片

第三单元 用python学习微积分(二十二)功、平均值、概率 ... 第7张图片

第三单元 用python学习微积分(二十二)功、平均值、概率 ... 第8张图片
显然这个c确实被削掉了。
同时,把所有的半径都考虑进去,那击中的概率为: 第三单元 用python学习微积分(二十二)功、平均值、概率 ... 第9张图片
这时老师添加了新的假设:
这个投掷标箭的人在7岁时, 靶子的半径为 a , 他中靶的概率为 0.5



fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)
ax.spines['left'].set_position('zero')
ax.spines['bottom'].set_position('zero')
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
ax.xaxis.set_ticks_position('bottom')
ax.yaxis.set_ticks_position('left')
ax.set_aspect(1)
x = symbols('x')

a = 1
expr = (a - x**2)**0.5

DrawXY(-a,a,100,expr,'red','r = a',plt)

expr = -(a - x**2)**0.5
DrawXY(-a,a,100,expr,'red','',plt)


r = symbols('r')
xminExpr = r*cos(-30*2/180*np.pi)

expr2 = -((2*a)**2 - x**2)**0.5
x1Min = float(xminExpr.subs(r,2*a))
DrawXY(x1Min,2*a,100,expr2,'gray','area where the people stand',plt)

xminExpr = r*cos(-30*2/180*np.pi)
expr3 = -((3*a)**2 - x**2)**0.5
x2Min=float(xminExpr.subs(r,3*a))
DrawXY(x2Min,3*a,100,expr3,'gray','',plt)

plt.plot([2*a, 3*a],[0,0], 'gray', '')
plt.plot([x1Min, x2Min],[expr2.subs(x,x1Min),expr3.subs(x,x2Min)], 'gray', '')

DrawText(3.2*a, 0, '3 o"clock',12)
DrawText(x1Min, expr3.subs(x,x2Min) - 0.2, '5 o"clock',12)

plt.legend(loc='upper left')
plt.show()
第三单元 用python学习微积分(二十二)功、平均值、概率 ... 第10张图片
由于上图灰色这段环占整个完整的圆环 第三单元 用python学习微积分(二十二)功、平均值、概率 ... 第11张图片 (....类似2个小时比12个小时...),所以有
本问题就是求 第三单元 用python学习微积分(二十二)功、平均值、概率 ... 第12张图片
由已知:  

第三单元 用python学习微积分(二十二)功、平均值、概率 ... 第13张图片

第三单元 用python学习微积分(二十二)功、平均值、概率 ... 第14张图片

第三单元 用python学习微积分(二十二)功、平均值、概率 ... 第15张图片

第三单元 用python学习微积分(二十二)功、平均值、概率 ... 第16张图片
再添加了各种预设后,这个题目的解, 站在标靶旁的小人被击中的概率约等于 1%
这个问题是讨论加权的平均值或带权重的积分
第三单元 用python学习微积分(二十二)功、平均值、概率 ... 第17张图片可知 第三单元 用python学习微积分(二十二)功、平均值、概率 ... 第18张图片 , 而当 r=0时,权重为0。
二、数值积分
1、黎曼集合(Riemann sums) 。。。。。(老师语:效率低, 而且结果不令人满意)
这个就是把函数曲线下面到x轴按  分为n个矩形相加得到面积的那个

第三单元 用python学习微积分(二十二)功、平均值、概率 ... 第19张图片
目标:平均值和累加y 来得到 第三单元 用python学习微积分(二十二)功、平均值、概率 ... 第20张图片 的近似值
左侧和:第三单元 用python学习微积分(二十二)功、平均值、概率 ... 第21张图片
右侧和:第三单元 用python学习微积分(二十二)功、平均值、概率 ... 第22张图片
用刚刚的权重函数做个例子
x = symbols('x')
expr = 2 *np.pi * x * np.e**(-x**2)
DrawXY(0,3,100,expr,'blue','2 *np.pi * x * e**(-x**2)',plt)
DrawRects(0,3,20,expr,'gray',plt, label='rect')
plt.legend(loc='upper left')
plt.show()
第三单元 用python学习微积分(二十二)功、平均值、概率 ... 第23张图片
2、梯形法 。。。。。。(老师语:效率低, 而且结果不令人满意)
这个方法和黎曼和的方法类似,就是不简单的切分矩形,而是换成根据平局的间隔  切分出不同的梯形,再累加。
x = symbols('x')
expr = 2 *np.pi * x * np.e**(-x**2)
DrawXY(0,3,100,expr,'blue','2 *np.pi * x * e**(-x**2)',plt)
DrawTrapezoidal(0,3,20,expr,'gray',plt, label='Trapezoidal')
plt.legend(loc='upper left')
plt.show()
第三单元 用python学习微积分(二十二)功、平均值、概率 ... 第24张图片
从结果看明显比黎曼和要好些....

第三单元 用python学习微积分(二十二)功、平均值、概率 ... 第25张图片

第三单元 用python学习微积分(二十二)功、平均值、概率 ... 第26张图片 (黎曼左侧和+黎曼右侧和) / 2
页面不能太大,剩下的请看Bullseye:第三单元 用python学习微积分(二十二)功、平均值、概率(下)和 数值积分 (2)


上一篇:完整版:全球著名咨询公司管理常用模型 (值得收藏!)
下一篇:MIT 6.858: Computer Systems Security 计算机系统安全 实验1
@



1.西兔生活网 CTLIVES 内容全部来自网络;
2.版权归原网站或原作者所有;
3.内容与本站立场无关;
4.若涉及侵权或有疑义,请点击“举报”按钮,其他联系方式或无法及时处理。
 
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

排行榜
活跃网友
返回顶部快速回复上一主题下一主题返回列表APP下载手机访问
Copyright © 2016-2028 CTLIVES.COM All Rights Reserved.  西兔生活网  小黑屋| GMT+8, 2024-9-10 09:44