精华内容
下载资源
问答
  • 递推方程的解法

    2021-04-03 09:56:25
    CONTENTS前言(Introduction)基础知识(The Basics)递推方程(Recursive Equations)一阶递推差分法不动点累加法累乘法常系数线性齐递推方程的解法无重根有重根常系数线性非齐递推方程的解法函数特征根为1的情况...

    -S-P-L-I-T-L-I-N-E-

    前言(Introduction)

    • 这是一篇离散数学(组合数学)的笔记。此内容笔者在刚接触算法时已学过。

    • 撰写之时笔者的离散数学老师也在讲授,不过嘛…一言难尽。

    • 某种意义上说这是相当重要的技巧,于是记录下来。


    基础知识(The Basics)

    递推方程(Recursive Equations)

    • 设序列{an}=a0,a1,,an,\{a_n\} = a_0,a_1,\dots,a_n,\dots
    • 一个将ana_n与某些个ai(i<n)a_i(i<n)联系起来的等式叫做{an}\{a_n\}递推方程
    • 在此基础上,给定恰当的初值就确定了序列

    一阶递推

    • 本部分是纯粹的高中知识复习,但如果你不够熟练的话还是建议看一看
    • 显然对于an=an1+C(A.P.)a_n = a_{n-1} +C(A.P.)an=an1×C(G.P.)a_n = a_{n-1}\times C(G.P.)都不需要讲解

    差分法

    • 原理:Sn=Sn1+an,SnS_n = S_{n-1}+a_n,S_n表示i=1nai\sum_{i=1}^{n}a_i

    ex.1.Sn=2an+1,a1=2S_n = 2a_n + 1,a_1 = 2,求ana_n

    • Sn1=2an1+1S_{n-1} = 2a_{n-1} + 1
    • 两式作差,得an=2an2an1a_n = 2a_n - 2a_{n-1}
    • 整理得,an=2na_n = 2^n

    不动点

    • 对于序列{an}\{a_n\},有an=pan1+Ca_n =pa_{n-1}+ C,此时我们使用不动点法

    • 其原理是令an=xa_n = x,在图像中表现为迭代求解,最终我们会得到一个不动点

    ex.2.汉诺塔的递推方程是an=2an1+1,a1=1a_{n} = 2a_{n-1}+1,a_1 = 1,求解ana_n

    • 有不动点方程为x=2x+1x = 2x+1
    • 解得不动点为x=1x = -1
    • 在等式两边减去不动点,得an+1=2(an1+1)(G.P.)a_n + 1 = 2(a_{n-1}+1)(G.P.)
    • 整理,得(an+1)/(a1+1)=2n1(a_n+1)/(a_1+1) = 2^{n-1}
    • 也即an=2n1a_n = 2^n-1

    累加法

    • 对于序列{an}\{a_n\},有an=an1+f(n)a_n =a_{n-1}+ f(n),此时我们使用累加法

    • 其原理是(anan1)+(an1an2)++(a2a1)=ana1(a_n-a_{n-1})+(a_{n-1}-a_{n-2})+\dots+(a_2-a_1) = a_n-a_1

    ex.3.an=an1+2n1,a1=2a_n = a_{n-1}+2n-1,a_1=2求解ana_n

    • anan1=2n1a_n - a_{n-1} = 2n-1
    • 累加,也即ana1=i=2n2i1=n21a_n - a_1 = \sum_{i=2}^{n}2i-1 = n^2-1
    • 也即an=n2+1a_n = n^2 + 1

    累乘法

    • 对于序列{an}\{a_n\},有an=an1×f(n)a_n =a_{n-1}\times f(n),此时我们使用累乘法

    • 其原理是anan1×an1an2×an2an3××a2a1=ana1\dfrac{a_n}{a_{n-1}}\times\dfrac{a_{n-1}}{a_{n-2}}\times\dfrac{a_{n-2}}{a_{n-3}}\times\dots\times\dfrac{a_2}{a_1} = \dfrac{a_n}{a_1}

    ex.4.fn=nfn1,f1=1f_n = nf_{n-1},f_1 = 1求解fnf_n(显然这就是阶乘)

    • 我们在等式两边同除fn1f_{n-1}得到fn/fn1=nf_n/f_{n-1} = n
    • 在等式两边同时取[2,n)[2,n)的「累乘」,得到fn/f1=i=2nif_n / f_1= \prod_{i=2}^{n} i
    • 带入初始值f1=1f_1 = 1
    • fn=i=1ni=n!f_n = \prod_{i=1}^{n}i = n!

    ex.5.(n+1)an=(n1)an1,a1=2(n+1)a_n = (n-1)a_{n-1},a_1=2求解ana_n

    • 化为anan1=n1n+1\dfrac{a_n}{a_{n-1}} = \dfrac{n-1}{n+1}
    • 在等式两边同时取[2,n)[2,n)的「累乘」,得ana1=2n(n+1)\dfrac{a_n}{a_1} = \dfrac{2}{n(n+1)}
    • 也即an=4n(n+1)a_n =\dfrac{4}{n(n+1)}

    *本文中会大量使用累加符号()(\sum)与累乘符号()(\prod)

    • 事实上,高中介绍的处理一阶递推的方法还有许多,不过以上的内容对于之下要讲解的基本够用了

    常系数线性齐次递推方程的解法

    如下是一个kk阶常系数线性齐次递推方程
    {H(n)a1H(n1)a2H(n2)akH(nk)=0H(0)=b0H(1)=b1H(2)=b2H(k1)=bk1\begin{cases}H(n)-a_1H(n-1)-a_2H(n-2)-\dots-a_kH(n-k) = 0\\ H(0) = b_0\\H(1)=b_1\\H(2)=b_2\\\dots\\H(k-1)=b_{k-1}\end{cases}
    a1,a2,,akak0,b0,b1,b2,,bk1其中a_1,a_2,\cdots,a_k均为常数,a_k\ne 0,b_0,b_1,b_2,\cdots,b_{k-1}被称作初值

    • 其解法被称作「特征根法」,在微分方程中也是此法
    • 该方法的核心思路是令an=xna_n = x^n
    • 于是,有特征方程xka1xk1ak=0x^k-a_1x^{k-1}-\dots-a_k = 0
    • 其根称作「特征根」,方程的通项的形式由特征根所确定

    prove:qprove:q是非00复数,则qnq^n是递推方程的解q\Leftrightarrow q是它的特征根

    • qnq^n是递推方程的解
    • qna1qn1a2qn2akqnk=0\Leftrightarrow q^n-a_1q^{n-1}-a_2q^{n-2}-a_kq^{n-k}=0
    • qnk(qka1qk1a2qk2ak)=0\Leftrightarrow q^{n-k}(q^k-a_1q^{k-1}-a_2q^{k-2}-a_k)=0
    • qka1qk1a2qk2ak=0\Leftrightarrow q^k-a_1q^{k-1}-a_2q^{k-2}-a_k = 0
    • q\therefore q是它的特征根
    • #\#

    无重根

    • 其形式为
      C1q1n+C2q2n++Ckqkn=0C_1q_1^n+C_2q_2^n+\dots+C_kq_k^n = 0
    • 最终带入初值,即可解得最终结果

    ex.6.求解斐波那契数列fn=fn1+fn2,f0=1,f1=1f_n = f_{n-1}+f_{n-2},f_0 =1,f_1 = 1的通项

    • 特征方程为x2x1=0x^2-x-1=0
    • 特征根为
      x1,2=1±52x_{1,2} = \dfrac{1±\sqrt5}{2}
      (此比值也被称作黄金分割)
    • 因此其通项形如fn=C1(1+52)n+C2(152)nf_n = C_1(\dfrac{1+\sqrt5}{2})^n + C_2(\dfrac{1-\sqrt5}{2})^n
    • 带入初值,得
      {C1=151+52C2=15152\begin{cases}C_1 = \dfrac{1}{\sqrt5}\dfrac{1+\sqrt5}{2}\\C_2 = -\dfrac{1}{\sqrt5}\dfrac{1-\sqrt5}{2}\end{cases}
    • 整理,得
      fn=15(1+52)n+115(152)n+1f_n = \dfrac{1}{\sqrt5}(\dfrac{1+\sqrt5}{2})^{n+1} - \dfrac{1}{\sqrt5}(\dfrac{1-\sqrt5}{2})^{n+1}

    有重根

    • 其问题出在两个重根线性相关,会破坏解的结构
    • 解决方法是修饰重根使得解之间线性无关

    Hi(n)=(Ci,1+Ci,2n++Ci,einei1)qinH_i(n) = \Big(C_{i,1} + C_{i,2}n+\dots+C_{i,e_i}n^{e_i-1}\Big)q_i^n

    • 于是其解的形式为
      H(n)=i=1tHi(n)H(n) = \sum_{i=1}^{t}H_i(n)

    ex.7.H(n)+H(n1)3H(n2)5H(n3)2H(n4)=0,H(0)=1,H(1)=0,H(2)=1,H(3)=2,H(n)+H(n-1)-3H(n-2)-5H(n-3)-2H(n-4)=0,H(0)=1,H(1)=0,H(2)=1,H(3)=2,求解H(x)H(x)

    • 特征方程是x4+x33x25x2=0x^4+x^3-3x^2-5x-2=0
    • 也即是(x+1)3(x2)=0(x+1)^3(x-2)=0
    • 其通项形如
      H(n)=(C1+C2n+C3n2)(1)n+C42nH(n) = (C_1+C_2n+C_3n^2)(-1)^n+C_42^n
    • 带入初值,也即
      [10010111201244113982]\begin{bmatrix}1 & 0 & 0 & 1 & 0\\-1&-1&-1&2&0\\1&2&4&4&1\\-1&-3&-9&8&2\end{bmatrix}
    • C1=79,C2=13,C3=0,C4=29C_1 = \dfrac{7}{9},C_2 = -\dfrac{1}{3},C_3 = 0,C_4 = \dfrac{2}{9}
    • 也即
      H(n)=79(1)n13n(1)n+292nH(n) = \dfrac{7}{9}(-1)^n-\dfrac{1}{3}n(-1)^n+\dfrac{2}{9}2^n

    常系数线性齐次递推方程的解法

    幂函数

    • 经典的常数变易法

    例如an+5an1+6an2=3n2a_n + 5a_{n-1}+6a_{n-2}= 3n^2求其通解

    • an=P1n2+P2n+P3a_n= P_1n^2+P_2n+P_3
    • 代入,得P1n2+P2n+P3+5[P1(n1)2+P2(n1)+P3]+6[P1(n2)2+P2(n2)+P3]=3n2P_1n^2+P_2n+P_3+5[P_1(n-1)^2+P_2(n-1)+P_3]+6[P_1(n-2)^2+P_2(n-2)+P_3]=3n^2
    • 整理,得
      {12P1=334P1+12P2=029P117P2+12P3=0\begin{cases}12P_1 &= 3\\-34P_1+12P_2 &= 0\\29P_1-17P_2+12P_3 &= 0\end{cases}
    • an=14n2+1724n+115288a_n^* = \dfrac{1}{4}n^2+\dfrac{17}{24}n+\dfrac{115}{288}
    • 最终可以得到通解an=C1(2)n+C2(3)n+14n2+1724n+115288a_n = C_1(-2)^n+C_2(-3)^n+\dfrac{1}{4}n^2+\dfrac{17}{24}n+\dfrac{115}{288}

    特征根为1的情况

    ex.8.H(n)H(n1)=7nH(n)-H(n-1)=7n求其通解

    • 特征根是1,不能设定为一次特解(同理,如果有11为重根,类似的,次数在此基础上依然要提高)
    • H(n)=P1n+P2H^*(n) = P_1n+P_2
    • 带入,得P1=P2=72P_1 = P_2 = \dfrac{7}{2}
    • 解得通解为H(n)=C×1n+27n(n+1)=C+27n(n+1)H(n) = C\times 1^n + \dfrac{2}{7}n(n+1) = C +\dfrac{2}{7}n(n+1)

    指数函数

    ex.9.an=6an1+8n1,a1=7a_n = 6a_{n-1}+8^{n-1},a_1=7求其通项

    • an=P8n1a_n^* = P8^{n-1},可解得P=4P = 4
    • 通解为an=C6n+4×8n1a_n = C6^n+4\times8^{n-1}
    • 代入可得,an=6n+8n2a_n = \dfrac{6^n+8^n}{2}

    指数的底为特征根

    • β\betaee重特征根,则特解为PneβnPn^e\beta^n

    ex.10.H(n)5H(n1)+6H(n2)=2nH(n)-5H(n-1)+6H(n-2)=2^n求其通解

    • H(n)=Pn2nH^*(n) = Pn2^n
    • Pn2n5P(n1)2n1+6P(n2)2n2=2nP_n2^n-5P(n-1)2^{n-1}+6P(n-2)2^{n-2}=2^n
    • 解得H(n)=n2n+1H^*(n)=-n2^{n+1}

    幂函数 + 指数

    • 将两部分结合即可

    ex.11.an2an1=n+3n,a=0a_n-2a_{n-1}=n+3^n,a_=0求其通项

    • 设特解为an=P1n+P2+P33na^*_n=P_1n+P_2+P_33^n
    • 代入,P1n+P2+P33n2[P1n+P2P1+P33n1]=n+3nP_1n+P_2+P_33^n-2[P_1n+P_2-P_1+P_33^{n-1}]=n+3^n
    • P1=1,P2=2,P3=3P_1=-1,P_2=-2,P_3=3
    • an=C2nn2+3n+1a_n = C2^n-n-2+3^{n+1}
    • 代入a0a_0,得an=2n+3n+1n2a_n = -2^n+3^{n+1}-n-2

    应用

    ex.12.归并排序最坏情况的时间复杂度为O(nlogn)\Omicron(n\log n),推导之

    • 最坏情况下,每一次计算逆序时有n1n-1个逆序(也就是有序数组)
    • T(n)=2T(n2)+n1,T(2)=1T(n) = 2T(\dfrac{n}{2}) + n - 1,T(2)=1特征根为22
    • n=2kn = 2^k
    • 也即T(2k)2T(2k1)=2k1T(2^k) - 2T(2^{k-1}) = 2^k - 1
    • 可以看作H(k)2H(k1)=2k1H(k) - 2H(k-1) = 2^k - 1
    • H(k)=P1+P2k2kH^*(k) =P_1+P_2k2^k
    • 代入,得P1=P2=1P_1 =P_2 = 1
    • H(k)=C2k+k2k+1=T(2k),C=1H(k) = C2^k+k2^k+1=T(2^k),C=-1
    • k=log2nk = log_2n,即T(n)=nlog2nn+1=O(nlogn)T(n) =n\log_2n-n+1 =\Omicron(n\log n)

    其他解法

    迭代法

    • 也即按照n1,n2,,1n-1,n-2,\dots,1展开

    ex.13.归并排序最坏情况的时间复杂度为O(nlogn)\Omicron(n\log n),推导之

    • 这次我们选取迭代法来推导

    T(n)=2T(n2)+n1=2(2T(n4)+n21)+n1==2kT(n2k)+kn+(12k)2k=n,k=log2n,=nT(1)+nlog2n+1n=O(nlogn)\begin{aligned}T(n) &= 2T(\dfrac{n}{2})+n-1\\ &= 2(2T(\dfrac{n}{4})+\dfrac{n}{2}-1)+n-1\\ &=\dots\\ &=2^kT(\dfrac{n}{2^k})+kn+(1-2^k)\\ &有2^k = n,也即k = log_2n,于是\\ &=nT(1)+nlog_2n+1-n\\ &=\Omicron(n\log n) \end{aligned}

    ex.14.计数a1,a2,,ana_1,a_2,\dots,a_n相乘(可交换)的方法数

    • 我们将ana_n插入到前面的(n2)(n-2)个空隙之中
    • 对于每个空隙,有左右两个部分,连带着首尾共有44个位置
    • 亦可只插入在首尾,这是额外的22
    • 因此计数为4(n2)+2=4n64(n-2)+2 = 4n-6
    • 也即H(n)=(4n6)H(n1),H(1)=1H(n) = (4n-6)H(n-1),H(1)=1$
    • 此时可以使用迭代法
    • 在这里我使用累乘法,有
      H(n)H(1)=i=2n2(2i3)=2n1i=2n(2i3)=2n1(2n3)!!\begin{aligned}\dfrac{H(n)}{H(1)} &= \prod_{i=2}^{n}2(2i-3) \\&= 2^{n-1}\prod_{i=2}^n(2i-3)\\ &= 2^{n-1}(2n-3)!!\end{aligned}
    • 可以进一步化简,我们都知道(2n)!=(2n)!!(2n1)!!(2n)! = (2n)!!(2n-1)!!
    • nn换成n1n-1,得(2n3)!!=(2(n1))!!(2(n1))!(2n-3)!!=\dfrac{(2(n-1))!!}{(2(n-1))!}
    • 补充2n12^{n-1}也就是(n1)(n-1)22
    • 即是LHS=(2n2)!(n1)!LHS = \dfrac{(2n-2)!}{(n-1)!}

    怎么感觉更复杂了hhh,反正我觉得很简明

    欧拉错排

    • 一个相当重要的递推

    取出一个元素TiT_i,它的位置是MiM_i,考虑MiM_i上有TjT_j

    • TiT_i放在MjM_j,剩余元素方案为D(n2)D(n-2)
    • 反之不放在MjM_j上,剩余元素方案是D(n1)D(n-1)
    • 于是有:
      Dn=(n1)(Dn1+Dn2),D1=0,D2=1D_n = (n-1)(D_{n-1}+D_{n-2}),D_1=0,D_2=1
      也就是DnnDn1=(Dn1(n1)Dn2)D_n - nD_{n-1}=-\Big(D_{n-1}-(n-1)D_{n-2}\Big)
    • T(n)=DnnDn1T(n) = D_n - nD_{n-1}
    • 容易发现,T(n)(G.P.)T(n)(G.P.)

    整理,得DnnDn1=(1)n2D_n-nD_{n-1} = (-1)^{n-2}

    • 也即
      Dn=nDn1+(1)n2=n(n1)Dn2+n(1)n1+(1)n=n(n1)(n2)Dn3+n(n1)(1)n2+n(1)n1+(1)n==n![111!+12!++(1)n1n!]=n!i=0n(1)i1i!\begin{aligned}D_n&=nD_{n-1}+(-1)^{n-2}\\ &=n(n-1)D_{n-2}+n(-1)^{n-1}+(-1)^n\\ &=n(n-1)(n-2)D_{n-3}+n(n-1)(-1)^{n-2}+n(-1)^{n-1}+(-1)^n\\ &=\dots\\ &=n![1-\dfrac{1}{1!}+\dfrac{1}{2!}+\dots+(-1)^n\dfrac{1}{n!}]\\ &=n!\sum_{i=0}^n(-1)^i\dfrac{1}{i!}\\ \end{aligned}\\
    • 另外,错位排列出现的概率是DnAnn=1e\dfrac{D_n}{A_n^n}=\dfrac{1}{e}
    • 我们有泰勒展开ex=1+x+12!x2++1n!xn+ο(xn)e^x = 1+x+\dfrac{1}{2!}x^2+\dots+\dfrac{1}{n!}x^n+\omicron(x^n)
    • x=1x = -1
      1e=i=0(1)i1i!\dfrac{1}{e}=\sum_{i=0}^\infin(-1)^i\dfrac{1}{i!}
      得证

    换元法

    ex.15.an2=2an12+1,a0=2a_n^2 = 2a_{n-1}^2+1,a_0=2求其通项

    • bn=an2b_n = a_n^2
    • 使用不动点法,解得bn=5×2n1b_n = 5\times2^n-1
    • 也即an=5×2n1a_n = \sqrt{5\times2^n-1}
    • 上面第一种方法解归并排序也是换元法的应用

    递归树

    • 用一棵树来描述递归过程

    例如对于T(n)=2T(n2)+n1T(n) = 2T(\dfrac{n}{2})+n-1

    • 将不含有T(x)T(x)的部分作为根
    n-1
    n/2-1
    n/2-1
    T(n/4)
    T(n/4)
    T(n/4)
    T(n/4)
    • 最后一定有树的高度(递归深度)logn\log n,而每层的工作量大致为nn,
    • 因此复杂度为O(nlogn)\Omicron(n\log n)

    差消法

    • 实际上是一种化简手段,化简之后再使用其他方法即可

    ex.16.快速排序的平均时间复杂度为O(nlogn)\Omicron(n\log n),试推导之

    • 对于不同的输入规模,有不同的子问题工作量
      T(0)+T(n1)+n1T(1)+T(n2)+n1T(n1)+T(0)+n1\begin{aligned}\\ T(0) + T(n-1) + n - 1\\ T(1) + T(n-2) + n - 1\\ \dots\\ T(n-1) + T(0) + n - 1\\ \end{aligned}
    • 将其加起来取平均值,可以得到递推式
    • T(n)=2ni=1n1T(i)+n1,T(1)=0T(n) = \dfrac{2}{n}\sum_{i=1}^{n-1}T(i) + n - 1,T(1)=0
    • 我们给出记号S(n)=i=1nT(i)S(n) = \sum_{i=1}^{n}T(i)
    • T(n)=2nS(n1)+n1T(n) = \dfrac{2}{n}S(n-1)+n-1
    • T(n1)=2n1S(n2)+n2T(n-1) = \dfrac{2}{n-1}S(n-2)+n-2
    • 两式作差,整理得nT(n)=(n+1)T(n1)+2nnT(n)=(n+1)T(n-1)+2n
    • 也就是T(n)n+1T(n1)n=2n+1\dfrac{T(n)}{n+1}-\dfrac{T(n-1)}{n}=\dfrac{2}{n+1}
    • 此时可以观察左边是两个连续项的差值,累加即可得到最终的结果
    • 整理,得T(n)n+1T(1)2=O(logn)\dfrac{T(n)}{n+1} - \dfrac{T(1)}{2} = \Omicron(\log n)(调和级数估计)
    • 也就是T(n)=O(nlogn)T(n) = \Omicron(n\log n)

    另外,快速排序最坏情况下会达到O(n2)\Omicron(n^2)

    主定理(Akra-Bazzi)

    简直是前辈们留下来的浪漫
    T(n)=aT(nb)+f(n)T(n)=aT(\dfrac{n}{b})+f(n)

    • 其中,nn为问题规模,aa为递推地子问题数量,nb\dfrac{n}{b}为每个子问题的规模,f(n)f(n)为递推以外进行的算法工作
      1. f(n)=O(nlogbaϵ),ϵ>0T(n)=Θ(nlogba)f(n)=\Omicron(n^{log_ba-\epsilon}),\epsilon>0\Rightarrow T(n) = \Theta(n^{\log_b^a})
      1. f(n)=Θ(nlogba)T(n)=Θ(nlogbalogn)f(n)=\Theta(n^{log_ba})\Rightarrow T(n) = \Theta(n^{\log_b^a}\log n)
      1. f(n)=Ω(nlogba+ϵ),ϵ>0,f(n)=\Omega(n^{log_ba+\epsilon}),\epsilon>0,且对于某个常数C<1,C<1,和所有充分大的nnaf(nb)cf(n)T(n)=Θ(f(n))af(\dfrac{n}{b})\le cf(n)\Rightarrow T(n) = \Theta(f(n))

    后记

    • 本文大量的数学公式,均使用LaTeX\LaTeX排版
    • 如果想要学习这个工具,可以参考这篇博客

    顺道一提,VSCode\rm VSCode是真的香
    在这里插入图片描述

    展开全文
  • 一元二次方程解法的实现(Python)

    千次阅读 2019-04-10 17:00:00
    请定义函数quadratic(a, b, c),接收3个参数,返回一元二次方程: ax2 + bx + c = 0两个解。 提示:计算平方根可以调用math.sqrt()函数 # -*- coding: utf-8 -*- # ax2+bx+c.py # @author 0yst3r...
    请定义一个函数quadratic(a, b, c),接收3个参数,返回一元二次方程:
    ax2 + bx + c = 0的两个解。
    提示:计算平方根可以调用math.sqrt()函数
     
    # -*- coding: utf-8 -*-
    # ax2+bx+c.py
    # @author   0yst3r
    # @description   一元二次方程解法
    # @created Wed Apr 10 2019 15:40:51 GMT+0800 (中国标准时间)
    # @last-modified Fri Apr 12 2019 09:22:48 GMT+0800 (中国标准时间)
    #
    import math
    
    
    def quadratic(a, b, c):
        if a == 0:
            if b == 0:
                if c == 0:
                    print('方程有任意解')
                else:
                    print('方程无解')
            else:
                x = -c / b
                print('方程有解:x=%.2f' % x)
        else:
            q = b * b - 4 * a * c
            if q > 0:
                x1 = (-b + math.sqrt(q)) / a / 2
                x2 = (-b - math.sqrt(q)) / a / 2
                print("一元二次方程的解为x1=%.2f,x2=%.2f" % (x1, x2))
                return ()
            elif q == 0:
                x1 = -b / a / 2
                x2 = x1
                print("一元二次方程的解相同,x1=x2=%.2f" % (x1))
                return x1, x2
            else:
                pass
                print("一元二次方程无解")
                return ()
    
    
    print('input a,b,c :')
    a = float(input('a:'))
    b = float(input('b:'))
    c = float(input('c:'))
    q = quadratic(a, b, c)
    

      

     
    运行结果:
     
     
     
     
     
     
     
     
     
     
     
     
     
     

    转载于:https://www.cnblogs.com/0yst3r-2046/p/10684568.html

    展开全文
  • 一元二次方程解法

    2018-07-18 14:01:41
    请定义函数quadratic(a, b, c),接收3个参数,返回一元二次方程: ax2 + bx + c = 0 两个解。 提示:计算平方根可以调用math.sqrt()函数: #!/usr/bin/env python3 # -*- conding: utf-8 -*- import math ...

    请定义一个函数quadratic(a, b, c),接收3个参数,返回一元二次方程:

    ax2 + bx + c = 0 的两个解。

    提示:计算平方根可以调用math.sqrt()函数:

    #!/usr/bin/env python3
    # -*- conding: utf-8 -*-
    import math
    
    def quadratic (a,b,c):
        if (b*b-4*a*c)>0:
            x1=(-b+math.sqrt(b*b-4*a*c))/(2*a)
            x2=(-b+math.sqrt(b*b-4*a*c))/(2*a)
            return x1,x2
        elif (b*b-4*a*c)==0:
            x1=x2=-c/b
            return x1
        else:
            return ('方程无解')
    
    a=float(input('输入a值='))
    b=float(input('输入b值='))
    c=float(input('输入c值='))
    print(quadratic(a ,b,c))

    正在学习python,如有错误,敬请抱歉!

    展开全文
  • 今天介绍种解纯二微分方程的方法: 首先来看下面的这种微分方程: y′′=f(y)y''=f(y)y′′=f(y) 其中fff是个实函数,而待解的未知实函数yyy是以ttt为实变量的,y′′y''y′′表示yyy关于ttt的二阶导函数。 求解...

    今天介绍一种解纯二阶微分方程的方法:

    首先来看下面的这种微分方程:

    y=f(y)y''=f(y)

    其中ff是个实函数,而待解的未知实函数yy是以tt为实变量的,yy''表示yy关于tt的二阶导函数。

    求解的过程其实就是找到那些函数形式y(t)y(t)使得它满足上述的这种微分方程。由于表面上看这一类方程里面没有一阶导函数yy',所以这类方程也叫做纯二阶微分方程。

    注意实函数ff可以是变化多端的啊,所以这一类方程其实并不好解的欧。

    好吧,开始今天的解法介绍:

    首先两侧乘上2y2y',方程变化为:

    2yy=2f(y)y2y'y''=2f(y)y'

    然后利用隐函数定理,并找到f(y)f(y)的不定积分形式F(y)+CF(y)+C,也就是说[F(y)+C]=f(y)[F(y)+C]'=f(y)。于是方程变化为:

    (y)2=2F(y)+2C(y')^2=2F(y)+2C

    其中CC是待定常数。所以有:

    y=±2F(y)+2Cy'=\pm\sqrt{2F(y)+2C}

    此时找到y(t)y(t)函数在待求解区域内的局部的逆函数g(y)g(y),它满足g[y(t)]tg[y(t)]\equiv t,并且由隐函数定理知g[y(t)]y(t)1g'[y(t)]y'(t)\equiv1,那么:

    g(y)=±12F(y)+2Cg'(y)=\pm\frac{1}{\sqrt{2F(y)+2C}}

    两侧关于yy做不定积分可得:

    tg(y)=D±dy2F(y)+2Ct\equiv g(y)=D\pm\int\frac{dy}{\sqrt{2F(y)+2C}}

    g(y)g(y)的形式知道了,就可以知道它在待求解区间上的逆函数y(t)y(t)的形式了。

    其中的待定常数CCDD可以根据边界条件得到:)

    展开全文
  • 引入并分析数值解第类积分子方程的光顺样条配置解法,证明了极值问题的解存在唯一且是个三样条函数,得到了极值问题等价的线性方程组.
  • 在数学物理方法中常见几种偏微分方程在柱坐标系或球坐标下分离变量时会出现二阶线性齐常微分方程,为了求解这类常微分方程,常用级数解法.该方法核心问题就是找解函数级数系数递推公式,本文推荐个比较...
  • 方法(以下简称待定函数法)用于求解波动方程和热传导方程的部分定解问题时,既能使边界条件齐化,又可使原方程仍保持齐方程形式。甚至可使相当部分非齐方程在边界条件齐化的同时,变成齐方程,从而...
  • 许多问题都可以归结为求解一元函数方程 ???? ???? = 0. 若????(????)为????多项式,则称其为????多项式方程或代数方程; 当???? ≤ 4时,多项式的方程的根可以用求根公式表示; 当???? ≥ 5时,其根已不能用...
  • 【Mark下】三个微分公式三元函数,二阶或者更高阶微分非线性方程利用Finite Difference Method展开,在利用牛顿迭代方法,解方程,其下是考虑到电脑无法存储大量举阵情况下分布解法。如果是N mesh grids,可以...
  • 求解Ginzburg-Landau方程在光纤通信中具有重要意义,为此提出种求解该方程的新方法,即根据齐平衡原则,利用F展开法的思想求出其行波解。利用了Riccati方程已知的三角函数和双曲函数表示的解,得到了Cinzburg-...
  • 利用重正规化理论讨论了类2阶2n+1非线性奇摄动微分方程,得到解一致有效表达式。所得结果当n=1时即是相关文献中分别用格林函数方法和逐步近似解法得出结果。同时将方程推广到更一般形式,得到所讨论方程小...
  • 提出种求解KdV方程的新方法,即利用齐平衡原则及F-展开法的思想求出其丰富的精确解。包括椭圆函数、双曲函数和三角函数表示的精确解,其中包含正负幂项的解是新形式的精确解。此方法为求解类似方程提供了借鉴。
  • 说明:这是数值分析前几章算法C++实现,可以解多元一次方程,用惯了matlab,有兴趣试试C++实现么?这是我做,欢迎找BUG。我测试得解均正确。不做代码说明了(函数划分写得非常清楚),具体可参考你数值分析...
  • 在自然科学和工程技术中很多问题解决常常归结为解线性代数方程组,例如电学中网络问题,船体数学放样中建立三样条函数问题,用最小二乘法求实验数据曲线拟合问题,解非线性方程组问题,用差分法或者有限元...
  • 二元一次不定方程的整数解(扩展欧几里得算法) (不得不说这是一堂数学*信竞课) 整数解解法 c(mod b)或ax+by=c有整数解当且仅当(a,b)|c 一般意义下的解法: 欧拉函数 扩展欧几里得算法 代码实现 ...
  • 基于对二阶复合型线性齐微分方程的一类边值问题的解的分析,研究了解式的相似结构和相似核函数,并提出了种求解该类边值问题的新方法――相似构造法。该法是求解该类复合型微分方程的边值问题和在实际工程应用中...
  • 因此,如何求得满足一定精度要求的方程的近似根也就成为了广大科技工作者迫切需要解决的问题。本软件就是针对这问题而设计的,内容包括:二分法、迭代法、迭代加速法、埃特金加速法、牛顿切线法、弦截法。软件采用...
  • 讨论了维热传导方程初边值问题中,通过构造辅助函数,化非齐边界条件为齐边界条件方法,使用这些方法.可以简化运算。
  • 原理 设在区间[a,b]上连续,且,根据连续函数性质可知在[a,b]内一定有根,并称[a,b]为方程的有根区间。 令 如果 则 b=c 区间还是为[a,b] 如果 则a=c区间还是为[a,b] 其中每个区间是前个区间的一半,二分以后得...
  • 基于变分原理,将二阶线性常微分方程的两点边值问题转化为等价的变分问题(即泛函极值问题),利用两点三Hermite插值构造个逼近可行函数的近似函数,从而将问题转化为个多元单目标优化问题,最后运用粒子群优化算法...
  • 7.3 迭代收敛加速方法/* Accelerating Method*/ 7.3.1 埃特金加速收敛方法 设 是根 某个近似值用迭代公式迭代一次得 由微分中值定理 其中 介于 与 之间. 假定 改变不大 3.1 若将校正值 再迭代一次又得 有 一般...
  • 首先在散落点上用三Multiquadric(MQ)函数的平移构造了个拟插值算子,分析了此拟插值算子的再生性、保形性和对分数阶导数的收敛性,最后利用上述拟插值算子并结合时间差分格式构造了空间分数阶扩散方程的计算格式...
  • MATLAB数学实验;主要内容;4.1 预备知识零点极值和最小二乘法 ...远在公元前1700年的古巴比伦人就已有关于一二次方程的解法九章算术(公元前50~100年)其中方程术有联立一次方程组的一般解法 1535年意大利数学家坦特格里亚
  • 那我们思路就很清晰了,构造个三次函数,f(x) = ax^3 + b * x^2 + cx + d,对这个三次函数进行求导,导数为0所对应点为极值点,然后我们只需要讲整个x轴分成三个区间[-∞, p1), [p1, p2], (p2, +∞), (p1:...
  • (关于最后的消去辅助变量x(K))最后一步是不是可以看成 如果让左右俩个函数都经过系统的...由于a等于特征单根,所以会跟之前的齐次方程的值合并掉,所以其中的P0之后是不存在的(合并掉了)所以需要再加个P1K ...
  • 7.3齐微分方程

    2020-11-15 09:30:10
    可分离变量微分方程是将f(x,y)分离成个关于x的函数个关于y的函数;齐微分方程则是将f(x,y)变成个关于y/x的方程 解法 还是直接上例题吧 例1 emmmm是不是觉得一道题写太多了?反正我觉得是 那我们把这...