MATLAB09

09 方程和方程组

9.1 方程和方程组的解析解(solve)

要保证变量x为一个符号变量

syms x
  1. 多项式合并 (x + 3x − 5x)x/4

    (x+3*x-5*x)*x/4
    

    return: $-\frac{x^2}{4}$

  2. 方程 ax2 + bx + c = 0

    syms a b c
    solve(a*x^2+b*x+c, x);
    

    第一个参数为求解的目标方程,第二个参数为求解变量

    y = a*x^2+b*x+c;
    solve(y, x);
    
  3. 方程 2x − x2 = e − x

    y = a*x - x^2 - exp(-x);solve(y, x);
    
  4. 方程组 $\begin{cases} x+by=5\\ax-y=x\end{cases}$

    syms a b x y
    y1 = x + b*y - 5;
    y2 = a*x - y - x;
    result = solve(y1, y2, x, y);
    result.x;
    result.t;
    

    solve返回的结果是一个结构体,通过访问结构体内部的元素展示结果

  5. 方程组 $\begin{cases}e^{-e^{-x_1-x_2}}=x_2(1+x^2_1)\\x_1cos(x_2)+x_2sin(x_1)=\frac{1}{2}\end{cases}$

    syms x1 x2
    y1 = exp(-exp(-x1-x2)) - x2*(1+x1^2);
    y2 = x1*cos(x2) + x2*sin(x1)-1/2;
    result = solve(yi, y2, x1, x2);
    
    result.x1;
    result.x2;
    

9.2 方程和方程组的数值解fsolve

用牛顿迭代法求近似解

  1. 方程 2x − x2 = e − x

    f = @(x)2*x-x^2-exp(-x);fsolve(f, 0);
    

    第二个参数为初值

  2. 方程组 $\begin{cases} x+by=5\\ax-y=x\end{cases}$

    a = 3; 
    b = 5;
    f = @(x)funs(x, a, b);
    fsolve(f, [0, 0])
    function y = funs(x, a, b) % x =[x, y] 
    	y(1) = x(1) + b*x(2) - 5; 
    	y(2) = a*x(1) - x(2) - x(1);
    end
    
  3. 方程组 $\begin{cases}e^{-e^{-x_1-x_2}}=x_2(1+x^2_1)\\x_1cos(x_2)+x_2sin(x_1)=\frac{1}{2}\end{cases}$

    f = @fun;fsolve(f, [0,0]);
    function y = fun(x) % x = [x1, x2] 
    	y(1) = exp(-exp(-x(1)-x(2))) - x(2)*(1+x(1)^2); 
    	y(2) = x(1)*cox(x(2)) + x(2)*sin(x(1))- 1/2;
    end
    

9.3 常微分方程和常微分方程的解析解(dsolve)

  1. 方程:y′ = 2x, 初值y(0) = 1

    syms y(x)
    desolve(diff(y) == 2*x, y(0) == 1)
    
  2. 方程:y″ = μ(1 − y2)y′ + y, 初值y(0) = 1, y′(0) = 0

    syms y(x) mu
    eqn = diff(y, 2) == mu*(1-y^2)*diff(y)+y
    cond1 = y(0) == 1;
    Dy = diff(y);
    cond2 = Dy(0) == 0;
    desolve(eqn, cond1, cond2)
    
  3. 方程组 $\begin{cases}y_1'=y_2\\y_2'=-y_1\end{cases},初值\begin{cases}y_1(0)=1\\y_2(0)=1\end{cases}$

    syms y1(x) y2(x)
    eqn1 = diff(y1) == y2;
    eqn1 = diff(y2) == -y1;
    cond1 = y1(0) == 1;
    cond2 = y2(0) == 1;
    result = desolve(eqn1, eqn2, cond1, cond2);
    
  4. 方程组 $\begin{cases}y_1'=a-(b+1)y_1+y_1^2y_2\\y_2'=by_1-y_1^2y_2\end{cases},初值\begin{cases}y_1(0)=3\\y_2(0)=4\end{cases}$

    syms y1(x) y2(x) a b
    eqn1 = diff == a-(b+1)*y1+y1^2*t2;
    eqn2 = diff(y2) == b*y1 = y1^2*y2;
    desolve(eqn1, eqn2);
    

9.4 常微分方程和常微分方程的数值解

有许多常微分方程,从理论上讲解存在,但无法求出其解析解,此时,需要寻求数值解。

基本思想:y′ = 2x,可以转化为 $\frac{y[n]-y[n-1]}{\Delta x}=2x\Rightarrow y[n]=y[n-1]+ax\Delta x,$然后通过迭代的方式来求解 $y_0$. 也因此,数值解法必须提供初值。

常微分方程(组)求解solver=ode45,ode23,ode113,ode15s,ode23s

MATLAB求解的标准形式:M(x, y) * y′ = F(x, y)

  1. 方程:y′ = 2x, 初值y(0) = 10, 积分区间[0, 10]

    f = @(x, y)2*x;tspan = [0, 10];y0 = 10;[x, y] = ode45(f, tspan, y0);
    

    匿名函数必须同时接受两个输入(x,y),即使其中一个输入未使用也是如此

  2. 方程:y″ = μ(1 − y2)y′ + y, 初值y(0) = 1, y′(0) = 0, 积分区间[0, 20]

    首先先转化为MATLAB标准形式:令y1 = y, y2 = y

    则转化为: $\begin{cases}y'=y_2\\y_2'=\mu(1-y_1^2)y_2+y_1\end{cases}$,其中M(x,y)对应的是单位矩阵,y′对应的是导数矩阵[y′, y2′]。F(x, y),对应的是函数矩阵

    mu = 1;
    f = @(×,y)fun(y,mu)
    tspan = [0, 20];
    y0 = [1 0];
    [x, y] = ode45(f, tspan, y0);
    plot(x,y(:,1), "r", x, y(:,2),"g");
    function ydot = fun(y, mu) 
    	ydot = [y(2); mu*(1-y(1)2)*y(2)+y(1)];
    end
    
  3. 方程组 $\begin{cases}y_1'=a-(b+1)y_1+y_1^2y_2\\y_2'=by_1-y_1^2y_2\end{cases},初值\begin{cases}y_1(0)=3\\y_2(0)=4\end{cases},积分区间[0, 10]$

    a= 100;
    b = 50;
    f =@(x,y)fun(y,a,b);
    tspan = [e 10];
    ye = [3 4];
    [x,y] =ode45(f,tspan,ye);
    plot(x, y(:,1),"r", x, y(:,2),"g")
    function ydot = fun(y, a, b) 
    	ydot = [a - (b+1)*y(1) + y(1)2*y(2);b*y(1)-y(1)2*y(2)];
    end