数学模型:Python实现差分方程

上篇文章:微分方程
文章摘要:差分方程的Python实现。
参考书籍:数学建模算法与应用(第3版)司守奎 孙玺菁。
PS1:只涉及了具体实现并不涉及底层理论。没有给出底层理论参考书籍的原因是不想做这个方向吧。所以对我只要掌握基本模型有个概念那就好了。
PS2:这里跳过数理统计直接来到差分方程那是因为:数理统计是机器学习的基础,数理统计想要好好学习一下。之后的支持向量机放在机器学习部分,再之后的章节遇到大型数学建模竞赛再来补充。结束差分方程暂时结束这个专栏学习。
文章声明:如有发现错误,还望批评指正。

文章目录

  • 贷款问题
  • 养老保险

同样由于这个博主不感兴趣,我们只选几个典型案例来做。

贷款问题

参考书籍例8.1
某消费者需贷款30万元,期限30年,年利率5.1%,采用固定额度还款,每月应还多少贷款。
模型建立:
y n y_n yn为第n个月的欠款总额; r = 0.051 12 × 100 % = 0.425 % r=\frac{0.051}{12}\times100\%=0.425\% r=120.051×100%=0.425%为月利率, N N N为360月, Q Q Q为贷款总额。
{ y n = ( 1 + r ) y n − 1 − x , n = 1 , 2 , … , N y 0 = Q \left\{\begin{matrix}y_n=(1+r)y_{n-1}-x,n=1,2,\dots,N\\y_0=Q\end{matrix}\right. {yn=(1+r)yn1x,n=1,2,,Ny0=Q
模型求解:
y n = ( 1 + r ) n y 0 − x ( 1 + r ) n − 1 r y_n=(1+r)^ny_0-x\frac{(1+r)^n-1}{r} yn=(1+r)ny0xr(1+r)n1
因为 y 360 = 0 y_{360}=0 y360=0,所以有:
x = ( 1 + r ) 360 Q r ( 1 + r ) 360 − 1 x=\frac{(1+r)^{360}Qr}{(1+r)^{360}-1} x=(1+r)3601(1+r)360Qr

Q=300000;r=0.051/12;N=360
print((pow(1+r,N)*Q*r)/(pow(1+r,N)-1))
#1628.849320201216

像这种有解析解,就挺好的。

养老保险

参考书籍例8.5
某保险公司的一份材料指出,在每月交200元到59岁末60岁开始领取养老金约定下,男子25岁开始投保届时月养老金2282元。假定人的寿命75岁,试求保险公司为了兑现责任,每月至少应该有多少投资收益率。
模型建立:
F k F_k Fk表示投保人在投保后第k个月所交保险费及收益累计总额, p p p为缴费期间费用, q q q为养老期间支出。
F k + 1 = F k ( 1 + r ) + p , k = 0 , 1 , … , N − 1 F k + 1 = F k ( 1 + r ) − q , k = N , N + 1 , … , M − 1 F_{k+1}=F_{k}(1+r)+p,k=0,1,\dots,N-1\\F_{k+1}=F_k(1+r)-q,k=N,N+1,\dots,M-1 Fk+1=Fk(1+r)+p,k=0,1,,N1Fk+1=Fk(1+r)q,k=N,N+1,,M1
模型解得:
F k = [ ( 1 + r ) k − 1 ] p r , k = 0 , 1 , … , N , F k = q r [ 1 − ( 1 + r ) k − m ] , k = N + 1 , N + 2 , … , M , F_k=[(1+r)^k-1]\frac{p}{r},k=0,1,\dots,N,\\F_k=\frac{q}{r}[1-(1+r)^{k-m}],k=N+1,N+2,\dots,M, Fk=[(1+r)k1]rp,k=0,1,,N,Fk=rq[1(1+r)km],k=N+1,N+2,,M,
带入则有:
F N = [ ( 1 + r ) N − 1 ] p r F N + 1 = q r [ 1 − ( 1 + r ) N + 1 − M ] , F_N=[(1+r)^N-1]\frac{p}{r}\\F_{N+1}=\frac{q}{r}[1-(1+r)^{N+1-M}], FN=[(1+r)N1]rpFN+1=rq[1(1+r)N+1M],
由于 F N + 1 = F N ( 1 + r ) − q F_{N+1}=F_N(1+r)-q FN+1=FN(1+r)q因此得:
q r [ 1 + ( 1 + r ) N + 1 − M ] = [ ( 1 + r ) M − 1 ] p r ( 1 + r ) − q \frac{q}{r}[1+(1+r)^{N+1-M}]=[(1+r)^M-1]\frac{p}{r}(1+r)-q rq[1+(1+r)N+1M]=[(1+r)M1]rp(1+r)q
化简得:
( 1 + r ) M − ( 1 + q p ) ( 1 + r ) M − N + q p = 0 (1+r)^M-(1+\frac{q}{p})(1+r)^{M-N}+\frac{q}{p}=0 (1+r)M(1+pq)(1+r)MN+pq=0
像这种没显示解得,就不好了。很多方法可以求解,例如二分。但是这里我们还是调用API吧。

M=600;N=420;P=200;Q=2282
from scipy.optimize import fsolve
def func(r):
    return pow((1+r),M)-(1+Q/P)*pow(1+r,M-N)+Q/P
print(fsolve(func,0))

1:.得r为0。2: 违反常识。开始质疑。3(1: 质疑api正确性,手动带入的确为0。3(2: 质疑存在多个零点,但是API只给出一个,带入标答0.0049求得0.27586315562580666,标答错误。3(3): 质疑公式的正确性,手推一遍的确如此。4: 得出结论——原书错误并且保险一本万利。
好了玩笑到此为止,虽然没有找到问题,但是得出几个既定事实。1) r ≠ 0 r\neq0 r=0,因为 r r r作了分母。2)书上公式是正确的,但是答案错误。

你可能感兴趣的:(数学建模,数学建模,差分方程,python)