2017-05-18 10 views
-1

あなたは行くように値をプロットする方法はありますか?何とかプロット関数にxとyの値を1つずつ渡します。私は本当に高価なループを持っていると私はループ内で直接プロットを使用して周りの唯一の方法(私は誰かのコードでこれを見たと思う)配列内の各yの値を保存するかもしれないと思う。 Attempted to access Y(1.00202); index must be a positive integer or logical.Matlab:計算中に値をプロットする方法は?

例コード:

function n = get_nodes(x_s, x_e, e_k) 
    y_prev = 0; y_curr = 1; 
    h = 10^-5; 
    n = 0; 
    for x = x_s+0.1:h:x_e-0.1 
     a = 2 + (5/6)*forcing(x, e_k)*h^2; 
     b = 1 - (1/12)*forcing(x-h, e_k)*h^2; 
     c = 1 - (1/12)*forcing(x+h, e_k)*h^2; 
     y_next = (a * y_curr + b * y_prev)/c; 
     y_prev = y_curr; 
     y_curr = y_next; 
     if (y_next == e_k) 
      n = n + 1; 
     end 
     % gives empty plot 
     plot(x, y_curr); 
    end 

end 

答えて

3

Kedarpの答えは、点単位でプロットを更新する方法を示していますが、インデックス作成の問題のために値を保存できないとも言いました。

このアプローチはまたy_curry_nexty_prevの必要性を取り除く、あなたのコードを体裁が整い、それはおそらくそれのために少し速く走る:

function n = get_nodes(x_s, x_e, e_k) 
    h = 10^-5; 
    n = 0; 
    x = x_s+0.1:h:x_e-0.1; % Set up x vector 
    y = zeros(size(x)); % pre-allocate vector for y_curr values 
    y(2) = 1;    % You previously called this y_curr, already y_prev = Y(1) = 0 
    for ii = 3:numel(x) % notice in particular that the loop starts from 3, for y(ii-2) 
     a = 2 + (5/6)*forcing(x(ii), e_k)*h^2; 
     b = 1 - (1/12)*forcing(x(ii)-h, e_k)*h^2; 
     c = 1 - (1/12)*forcing(x(ii)+h, e_k)*h^2; 
     % Assign next y value, swapping which value is current happens naturally 
     y(ii) = (a * y(ii-1) + b * y(ii-2))/c;   
    end  
    n = sum(y == e_k);  % now we have y stored, we can get n outside the loop 
    plot(x,y)    % can just plot all at once... 
end 

編集:あなたも賢いされていた場合forループの外側でa,b,cの計算を行うことになります。あなたは毎回3つの近隣点を行うので、iiごとにforcing(x(ii), e_k)を3回計算しています。

それはベクトルxを取ることができるようにあなたがforcingを設定する場合、あなたは一度f = forcing(x, e_k)を呼び出すことができ、その後、あなたがabcを定義し、単にループ内yを反復処理することができます。 それは確かに時間を節約するでしょう。

+0

これは本当に魅力のように働きました。あなたの提案は非常に高く評価されています。強制は、単一のパラメータを持つ他の関数で使用されますが、可変数のパラメータを持つ関数を作成できるか、または配列が渡されているかどうかを確認できませんか? – anegrea

+0

"要素ごとの演算"(標準演算子の前にドットを使用)とおそらく 'bsxfun'を調べると、これらはスカラーとベクトルの両方で機能する関数を作成するのに役立ち、Matlabの効率はすべてベクトル化に関するものです! – Wolfie

1

あなたが計算しながら、プロットに行きたい場合は、現在の1に前のポイントからラインを定義する必要がありますしかし、これは私のようなエラーが発生しますループ内で、前のポットを保持します。プロットラインを次のように変更することができます:

+0

残念ながら、プロットの点はまだありません。 – anegrea

1

毎回新しいプロットを作成するのではなく、ループでプロットするプロットハンドルオブジェクトを設定することをお勧めします。例えば、

x = 1:100; 
% Initialise plot handle 
h = plot(nan,nan); 

for iter = 1:1e2 
    y = rand + rand*x + rand*(x.^2); 
    % set appropriate values of handle 
    set(h, {'XData','YData'}, {x, y}); 
    drawnow; 
end 

この方法では、plotハンドルは一度だけ作成され、そのプロパティは、ループ内に設定されています。

関連する問題