2017-04-21 113 views
0

下面是我試過的代碼:數值答案 - 微分方程MATLAB

syms y(x) 
Du = diff(y,x); 
ode = diff(y,x,2) - (0.5/(x+1))*diff(y,x)+0.5*x*y == x; 
cond1 = y(1.3) == 0.5; 
cond2 = Du(1.3) == 2; 
conds = [cond1 cond2]; 

uSol(x) = dsolve(ode,conds) 

如果有一個象徵性的答案,將工作,但我想沒有。任何人都可以告訴我如何得到這個方程的答案?

這就是答案,我得到:

Warning: Explicit solution could not be found. 
> In `dsolve` (line 201) 
    uSol(x) = 
    [ empty sym ] 

+1

對於這類問題,你爲什麼不使用['鎢alpha'](http://www.wolframalpha.com/)? – qbzenker

回答

1

您可以使用ode45或者你可以使用一個數值方法。 0.5 * X * Y + 0.5 -

要將方程分裂成兩個一階方法

U(X)= Y '(x)的

U'(x)= X

無論哪種方式* U /(X + 1)

Y(1.3)= 0.5

U(1.3)= 2

這樣做時,自己...

function StackOverflow 
close all 
set(groot,'defaultLineLineWidth',3) 

dx=0.01; 
x = (0:dx:1.3)'; 
N = length(x); 

Y = nan(size(x,1),2); 
Y(N,:) = [0.5, 2]; 

F [email protected](x,y) [y(2) , x-0.5*x.*y(1)+0.5*y(2)./(x+1)]; 

for i=N:-1:2        % calculation loop 
    k_1 = F(x(i), Y(i, :)); 
    k_2 = F(x(i) + 0.5*dx, Y(i,:) + 0.5*dx*k_1); 
    k_3 = F(x(i) + 0.5*dx, Y(i,:) + 0.5*dx*k_2); 
    k_4 = F(x(i) +  dx, Y(i,:) +  dx*k_3); 

    Y(i-1,:) = Y(i,:) + (dx/6)*(k_1+2*k_2+2*k_3+k_4); % main equation 
end 

y = Y(:,1); 
u = Y(:,2); 

figure(1) 
set(gcf, 'units', 'normalized') 

subplot(2,1,1) 
plot(x , y) 
set(gca,'fontsize',14, 'Position',[0.12 0.57 0.85 0.40]) 
xlim([min(x), max(x)]) 
xticks(linspace(min(x), max(x), 5)) 
xticklabels({}) 
ylabel('$y(x)$', 'Interpreter', 'latex') 


subplot(2,1,2) 
plot(x , u) 
set(gca,'fontsize',14, 'Position',[0.12 0.125 0.85 0.40]) 
xlim([min(x), max(x)]) 
xticks(linspace(min(x), max(x), 5)) 

xlabel('$x$', 'Interpreter', 'latex') 
ylabel('$y''(x)$', 'Interpreter', 'latex') 

end 

,或者讓Matlab的爲你做...

function StackOverflow2 

%Note: t = xMax - x 
[t,Y] = ode45(@F ,[0 1.3],[0.5; 2]); 

z = flipud([t,Y]); 
x = max(t) - z(:,1); 
y = z(:,2); 
u = z(:,3); 

figure(2) 
subplot(2,1,1) 
plot(x , y) 
set(gca,'fontsize',14, 'Position',[0.12 0.57 0.85 0.40]) 
xlim([min(x), max(x)]) 
xticks(linspace(min(x), max(x), 5)) 
xticklabels({}) 
ylabel('$y(x)$', 'Interpreter', 'latex') 


subplot(2,1,2) 
plot(x , u) 
set(gca,'fontsize',14, 'Position',[0.12 0.125 0.85 0.40]) 
xlim([min(x), max(x)]) 
xticks(linspace(min(x), max(x), 5)) 

end 

function dydt = F(t,y) 

dydt = [y(2); (1.3-t)-0.5*(1.3-t).*y(1)+0.5*y(2)./((1.3-t)+1)]; 

end 
+0

哦哇..謝謝!我還沒有在編程方面進步,所以我不瞭解它的大部分,代碼也沒有運行,所以我可能不會找到這個錯誤。 – Rih

+0

哪一個不運行?什麼是錯誤? – user1543042

0

在最早的Matlab的版本中,函數的定義是不允許裏面的腳本。從@user1543042

以答案你應該把這個在一個文件

function StackOverflow2 

%Note: t = xMax - x 
[t,Y] = ode45(@F ,[0 1.3],[0.5; 2]); 

z = flipud([t,Y]); 
x = max(t) - z(:,1); 
y = z(:,2); 
u = z(:,3); 

figure(2) 
subplot(2,1,1) 
plot(x , y) 
set(gca,'fontsize',14, 'Position',[0.12 0.57 0.85 0.40]) 
xlim([min(x), max(x)]) 
xticks(linspace(min(x), max(x), 5)) 
xticklabels({}) 
ylabel('$y(x)$', 'Interpreter', 'latex') 


subplot(2,1,2) 
plot(x , u) 
set(gca,'fontsize',14, 'Position',[0.12 0.125 0.85 0.40]) 
xlim([min(x), max(x)]) 
xticks(linspace(min(x), max(x), 5)) 

end 

而這在另一個文件:

function dydt = F(t,y) 

dydt = [y(2); (1.3-t)-0.5*(1.3-t).*y(1)+0.5*y(2)./((1.3-t)+1)]; 

end