2017-08-28 278 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; 

我有欧拉方法将R代码是

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代码,是否需要改变欧拉法(R代码)H与(b - 一)/n将欧拉代码修改为中点法?

+0

@Sardar乌萨马,我想修改欧拉代码到中点方法。我在R中添加了欧拉代码。我在Matlab中找到了一个用于中点方法的代码,因此我正在寻找将其转换为R的方法。 – david

+1

中点方法属于更广泛的龙格库塔方法类。看看'deSolve'软件包。 'rkMethod'的参考以及其中一个小插曲演示了如何定义一个应用中点方法的函数:https://cran.r-project.org/web/packages/deSolve/index.html –

回答

3

广义地讲,我同意表达意见;不过,我决定投这个问题。 (现在删除)这是由于matconv的存在促进了这个过程。

回答

鉴于你的代码,我们可以通过以下方式使用matconv

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

创建的out对象将尝试翻译Matlab代码为R,但是,这项工作还远没有结束。如果你检查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 =函数[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; y(i,:) + halfh * f(t(i),y(i,:)); y(i + 1,:) = y(i,:) + h * f(t(i)+ halfh,z); 结束; out < - mat2r(inMat =“input.m”) – david

+0

@david'input.m'是你的Matlab代码文件。转换的代码将在'out $ rCode [n]'中提供,'n'代表每个转换后的行。正如我在答复中提到的,更复杂的陈述可能无法完美地翻译。 – Konrad