我想知道如何将此代码从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代码,我是否需要将euler方法(R代码)中的h更改为(b-a)/ n以将Euler代码修改为中点方法?
答案 0 :(得分:4)
从广义上讲,我同意所表达的意见;但是,我决定投票支持这个问题。 (现已删除)这是由于matconv
的存在促进了这一过程。
鉴于您的代码,我们可以通过以下方式使用matconv
:
pacman::p_load(matconv)
out <- mat2r(inMat = "input.m")
创建的out
对象将尝试将Matlab代码转换为R,但是,这项工作还远未完成。如果您检查out
对象,您将看到它需要进一步的工作。通常使用Matlab注释%
替换为#
等来正确翻译简单语句,但更复杂的语句可能需要更详细的调查。然后,您可以检查相应的行并尝试评估它们以查看可能需要进一步工作的位置,例如:
eval(parse(text=out$rCode[1]))
NULL
(第一行是注释,因此输出为NULL)