2017-03-16 135 views
0

我有一個代碼,我想添加一個額外的情節。我想繪製兩個函數的相對誤差。我不確定在循環中放置這個的位置,以便它不會給我一個錯誤消息,並將所有三種情況繪製爲單個圖形。此外,我的相對錯誤代碼可能有一些錯誤,這可能是導致問題的原因。在MATLAB中繪圖

這是相對誤差的代碼:

rel_error = (y_exact1 - Y(:,2)')./y_exact; %relative error 
figure() 
plot(T,rel_error,'r') 

這是我需要將其添加到

function ivp1() 
clear;clc;close all; 
t=linspace(0,2.5); 
K=[.02 .1 1.5]; 

for i=1:3 
k =K(i); 

[T,Y] = ode45(@prblm1_fun,t,0); %Solving for the approximate solution to the IVP 

figure() 
plot(T,Y) 
hold on 

y_exact1 = 1/(k^2+pi^2)*(pi*exp(k*t)-pi*cos(pi*t)-k*sin(pi*t)); 
y_exact2 = 1/(2*k)*(exp(k*(t-1))-1) + pi/(k^2+pi^2)*(exp(k*t) + exp(k* (t-1))); 
y_exact3 = 1/2/k*(exp(k*(t-1))-exp(k*(t-2))) + pi/(k^2+pi^2)*(exp(k*t) + exp(k*(t-1))) + 1/2/(k-1)*(exp(k*(t-2)) - exp(t-2)); 

for i=1:length(t) 

if t(i)<1 
plot(t(i),y_exact1(i),'mo') 
hold on 

elseif t(i)<2 
plot(t(i),y_exact2(i),'mo') 
hold on 

else 
plot (t(i),y_exact3(i),'mo') 
hold on 

end 
end 
end 
function dy= prblm1_fun(t,y) %This is the function of the IVP for  varying values of t 
dy = zeros(1,1); 
if t < 1 
dy(1)= y(1)*k + sin(pi*t); 
elseif t < 2 
dy(1)= y(1)*k + 0.5; 
else 
dy(1)= y(1)*k + exp(t-2)/2; 
end 
end 
end 

功能這是k個值中的一個所期望的結果: Image 1

Image 2

+0

錯誤訊息你好嗎?你能附上一個期望結果的圖表(即使是_paint_中的原油)嗎? –

+0

@ Dev-iL我剛剛添加了圖片 – Riya

回答

0

兩個錯誤的地方:

1)Y是從ode45的結果100x1矩陣。嘗試訪問Y(:,2)會導致出現界外錯誤。

2)y_exact未定義。您只有y_exact1,y_exact2y_exact3

示例代碼:

function ivp1() 
clear;clc;close all; 
t=linspace(0,2.5); 
K=[.02 .1 1.5]; 

for i=1:3 
    k =K(i); 

    [T,Y] = ode45(@prblm1_fun,t,0); %Solving for the approximate solution to the IVP 

    figure() 
    plot(T,Y) 
    hold on 

    y_exact1 = 1/(k^2+pi^2)*(pi*exp(k*t)-pi*cos(pi*t)-k*sin(pi*t)); 
    y_exact2 = 1/(2*k)*(exp(k*(t-1))-1) + pi/(k^2+pi^2)*(exp(k*t) + exp(k* (t-1))); 
    y_exact3 = 1/2/k*(exp(k*(t-1))-exp(k*(t-2))) + pi/(k^2+pi^2)*(exp(k*t) + exp(k*(t-1))) + 1/2/(k-1)*(exp(k*(t-2)) - exp(t-2)); 

    for j=1:length(t) 
     if t(j)<1 
      y_exact = y_exact1(j); 
     elseif t(j)<2 
      y_exact = y_exact2(j); 
     else 
      y_exact = y_exact3(j); 
     end 
     plot(t(j),y_exact,'mo') 
    end 
    rel_error = (y_exact1 - Y(:,1)')./y_exact; %relative error 
    plot(T,rel_error,'r') 
end 
function dy= prblm1_fun(t,y) %This is the function of the IVP for  varying values of t 
dy = zeros(1,1); 
if t < 1 
    dy(1)= y(1)*k + sin(pi*t); 
elseif t < 2 
    dy(1)= y(1)*k + 0.5; 
else 
    dy(1)= y(1)*k + exp(t-2)/2; 
end 
end 
end 

輸出示例:

enter image description here