matlab微分方程

时间:2015-05-26 20:52:40

标签: matlab math polynomial-math differential-equations

我有以下微分方程,我无法解决。

differential equation

我们知道以下关于等式:

D(r)是三年级多项式

D'(1)= D'(2)= 0

d(2)= 2D(1)

U(1)= 450

u'(2)= - K *(u(2)-Te)

其中K和Te是常数。

我想用矩阵来近似问题,我设法解决了 类似的等式:equationeasier具有与u(1)和u'(2)相同的限制条件。 在这个等式上我接近你的概率。和你''具有中心差异并且在r = 1到r = 2之间使用有限差分方法。然后我将结果放在matlab中的矩阵A和matlab中的向量Y中的极限条件下,并运行u = A \ Y来得到u值如何变化。继承了我设法解决的等式的matlab代码:

    clear
    a=1;
    b=2;
    N=100;
    h = (b-a)/N;
    K=3.20;
    Ti=450;
    Te=20;

    A = zeros(N+2);
    A(1,1)=1;
    A(end,end)=1/(2*h*K);
    A(end,end-1)=1;
    A(end,end-2)=-1/(2*h*K);


    r=a+h:h:b;

    %y(i)
    for i=1:1:length(r)
       yi(i)=-r(i)*(2/(h^2));
    end
    A(2:end-1,2:end-1)=A(2:end-1,2:end-1)+diag(yi);

    %y(i-1)
    for i=1:1:length(r)-1
        ymin(i)=r(i+1)*(1/(h^2))-1/(2*h);
    end
    A(3:end-1,2:end-2) = A(3:end-1,2:end-2)+diag(ymin);

    %y(i+1)
    for i=1:1:length(r)
       ymax(i)=r(i)*(1/(h^2))+1/(2*h);
    end
    A(2:end-1,3:end)=A(2:end-1,3:end)+diag(ymax);


    Y=zeros(N+2,1);
    Y(1) =Ti;
    Y(2)=-(Ti*(r(1)/(h^2)-(1/(2*h))));
    Y(end) = Te;
    r=[1,r];
    u=A\Y;
    plot(r,u(1:end-1));

我的问题是,如何解决第一个微分方程?

1 个答案:

答案 0 :(得分:0)

正如TroyHaskin在评论中指出的那样,人们可以将D确定为一个常数因子,并且该常数因子无论如何都会在D' / D中取消。换句话说:我们可以假设D(1)= 1(一个方便的数字),因为D可以乘以任何常数。现在很容易找到系数(done with Wolfram Alpha),而多项式结果是

D(r)= -2r ^ 3 + 9r ^ 2-12r + 6

与导数D'(r)= -6r ^ 2 + 18r-12。 (还有一种更聪明的方法可以从D'开始找到多项式,它是已知根的二次方。)

我可能会立即使用这些信息,计算一阶导数的系数k:

r = a+h:h:b;
k = 1+r.*(-6*r.^2+18*r-12)./(-2*r.^3+9*r.^2-12*r+6);

似乎k在区间[1,2]上始终为正,因此如果要最小化对现有代码的更改,只需将r(i)替换为其中的r(i)/ k(i)。

顺便说一句,而不是像

这样的循环
for i=1:1:length(r)
   yi(i)=-r(i)*(2/(h^2));
end

一个人通常只是

yi=-r*(2/(h^2));

这个矢量化使代码更紧凑,也可以使性能受益(在你的例子中,解决线性系统是瓶颈)。另一个好处是yi被正确初始化,而在你的循环结构中,如果yi恰好已经存在且长度大于length(r),则生成的数组将具有无关的条目。 (这是难以追踪的错误的潜在来源。)