2017-02-18 11 views
0

Я пытаюсь получить список для N, который будет [8 16 32 64 128 256 512 1024], но когда я ввожу массив, я получаю «Входы размера должны быть скалярными» ошибка на нулях часть кода.Сообщение об ошибке входного массива

function Euler_second_order 

a = input('Enter your a = '); b =input('Enter your b = '); 
y0 = input('Enter y(t0) = '); N = input('Enter your N or Ns: '); 

fprintf('  \nThe Second-Order Euler''s method\n') 

for n = 1:numel(N) %iterate through the list of N 
w = zeros(N+1,1); t = zeros(N+1,1); 

w(1)= y0; 

t(1) = a; 
h = (b-a)/N; 

max = 0; 
for k = 1:N  %suppose to go from 1 to the current N 
    w(k+1) = w(k) + h*f(t(k),w(k)) + ((h^2)/2)*(Fprimet(t(k),w(k)) +  Fprimey(t(k)) * f(t(k),w(k))); 
t(k+1) = t(k) + h; 
    p = w(k) - Y(t(k)); 
    if max < abs(p) 
     max = abs(p); 
    end 

    end 
fprintf('%5d %12.8f\n',N, max) %prints the N array 
end 

function dydt = f(t,y) 
dydt = y*(1 + exp(2*t)); 
end 

function yexact = Y(t) 
yexact = exp(t+(exp(2*t)-1)/2); 
end 

function dfdt = Fprimet(t,y) %derivative with respect to t 
dfdt = 2*y*exp(2*t); 
end 

function dfdy = Fprimey(t) %derivative with respect to t 
dfdy = 1 + exp(2*t); 
end 

end 

ответ

0

Вы используете капитал N вместо переменной, повторяется для n, во всем теле функции. Таким образом, ваша основная функция будет выглядеть так:

for n = 1:numel(N) %iterate through the list of N 
w = zeros(n+1,1); t = zeros(n+1,1); 

w(1)= y0; 

t(1) = a; 
h = (b-a)/n; 

max = 0; 
for k = 1:n  %suppose to go from 1 to the current N 
    w(k+1) = w(k) + h*f(t(k),w(k)) + ((h^2)/2)*(Fprimet(t(k),w(k)) +  Fprimey(t(k)) * f(t(k),w(k))); 
    t(k+1) = t(k) + h; 
    p = w(k) - Y(t(k)); 
    if max < abs(p) 
     max = abs(p); 
    end 

end 
fprintf('%5d %12.8f\n',n, max) %prints the N array 
end 
+0

исправлена ​​ошибка, но результат неправильный. он печатает 1, 2, 3. Я хотел 8 16 32 – user7081818

+0

Я понял это. благодаря – user7081818