我有以下微分方程,我无法解决。
我们知道以下关于等式:
D(r)是三年级多项式
D'(1)= D'(2)= 0
d(2)= 2D(1)
U(1)= 450
u'(2)= - K *(u(2)-Te)
其中K和Te是常数。
我想用矩阵来近似问题,我设法解决了 类似的等式:具有与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));
我的问题是,如何解决第一个微分方程?
答案 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),则生成的数组将具有无关的条目。 (这是难以追踪的错误的潜在来源。)