2017-02-18 9 views
0

私は[8 16 32 64 128 256 512 1024]となるNのリストを取得しようとしていますが、配列を入力すると「サイズ入力はスカラーでなければなりません」というエラーがゼロコードの一部。入力配列のエラーメッセージ

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

あなたは全体の関数本体ではなく、反復変数の首都Nnを使用しています。だから、あなたの主な機能は次のようになります:

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