2017-08-28 17 views
-2

このコードをMatlabからRコードにどのように変換できるのでしょうか。これは中点法のコードだと思われる。どんな助けも高く評価されます。matlabコードをRコードに変換する

% Usage: [y t] = midpoint(f,a,b,ya,n) or y = midpoint(f,a,b,ya,n) 
% Midpoint method for initial value problems 
% 
% Input: 
% f - Matlab inline function f(t,y) 
% a,b - interval 
% ya - initial condition 
% n - number of subintervals (panels) 
% 
% Output: 
% y - computed solution 
% t - time steps 
% 
% Examples: 
% [y t]=midpoint(@myfunc,0,1,1,10);   here 'myfunc' is a user-defined function in M-file 
% y=midpoint(inline('sin(y*t)','t','y'),0,1,1,10); 
% f=inline('sin(y(1))-cos(y(2))','t','y'); 
% y=midpoint(f,0,1,1,10); 

function [y t] = midpoint(f,a,b,ya,n) 
h = (b - a)/n; 
halfh = h/2; 
y(1,:) = ya; 
t(1) = a; 
for i = 1 : n 
    t(i+1) = t(i) + h; 
    z = y(i,:) + halfh * f(t(i),y(i,:)); 
    y(i+1,:) = y(i,:) + h * f(t(i)+halfh,z); 
end; 

Iは

euler <- function(f, h = 1e-7, x0, y0, xfinal) { 
         N = (xfinal - x0)/h 
         x = y = numeric(N + 1) 
         x[1] = x0; y[1] = y0 
         i = 1 
         while (i <= N) { 
         x[i + 1] = x[i] + h 
         y[i + 1] = y[i] + h * f(x[i], y[i]) 
         i = i + 1 
               } 
         return (data.frame(X = x, Y = y)) 
             } 

ので、MATLABコードに基づいて、私は(B - A)にオイラー法(Rコード)でHを変更する必要がないであるオイラー法のためのRコードを有します/ nを使用して、オイラーコードをmidpointメソッドに変更しますか?

+0

@Sardarウサマ・、オイラーコードをmidpointメソッドに変更したい。 Rにオイラーコードを追加しました。Matlabの中点メソッドのコードを見つけましたので、それをRに変換する方法を探していました。 – david

+1

中点メソッドは、より広いクラスのRunge-Kuttaメソッドに属しています。 'deSolve'パッケージを見てください。 'rkMethod'のリファレンスとビネットの1つは、midpointメソッドを適用する関数を定義する方法を示します:https://cran.r-project.org/web/packages/deSolve/index.html –

答えて

3

大まかに言えば、私は表現のコメントに同意します。しかし、私はこの質問に投票することにしました。 (今削除されました)これは、このプロセスを容易にするmatconvが存在するためです。あなたのコードを考える

回答

、我々は次のようにmatconvを使用することができます。

pacman::p_load(matconv) 
out <- mat2r(inMat = "input.m") 

作成outオブジェクトがRにMATLABコードを変換しようとします、しかし、仕事は完了までは程遠いのです。 outオブジェクトを調べると、それ以上の作業が必要になることがわかります。単純なステートメントは通常Matlabのコメント%#などに置き換えて正しく翻訳されますが、より複雑なステートメントではさらに詳細な調査が必要な場合があります。その後、それぞれのラインを点検し、さらなる作業が必要になることがあり場所を確認するためにそれらを評価しようとすると、たとえばできます

eval(parse(text=out$rCode[1])) 
NULL 

(出力がNULLであるので、最初の行はコメントです)

+0

注意あなたが答えた質問はすでに長いこと前に尋ねられています。 https://stackoverflow.com/questions/5527145/convert-matlab-code-to-r https://stackoverflow.com/questions/12246309/how-to-convert-matlab-scripts-in-rしたがって、そこに答える方が良いです。しかし、そのような質問は、あまり話題にはならないことに注意してください。 – m7913d

+0

@コメントありがとうございます。これは正しいです? input.m = function [y t] =中点(f、a、b、ya、n) h =(b-a)/ n; halfh = h/2; y(1、:) = ya; t(1)= a; i = 1の場合 n: t(i + 1)= t(i)+ h;z = y(i、:) + halfh * f(t(i)、y(i、:));y(i + 1、:) = y(i、:) + h * f(t(i)+ halfh、z); end; out < - mat2r(inMat = "input.m") – david

+0

@david 'input.m'はMatlabコードを持つファイルです。変換されたコードは 'out $ rCode [n]'で利用可能になり、 'n'は変換された各行を反映します。私の答えで述べたように、より複雑なステートメントは完全には翻訳されないかもしれません。 – Konrad

関連する問題