#matlab #function #math #anonymous-function #nested
#matlab #функция #математика #anonymous-функция #вложенный
Вопрос:
Привет, это может быть очень простой вопрос, но я застрял, и я пытаюсь сделать это некоторое время, пожалуйста, помогите мне.
Я пытаюсь сделать что-то вроде этого:
a=0.5;
ODE= @(x,y) ((-2*(a^2)*x*y)/(x^2 y^2)^2)/(1-((a^2)*(x^2-y^2)/(x^2 y^2)^2));
%The classical RK4 solution as a function
k1 = ODE(x,y);
k2 = ODE(x 0.5*dx,y k1*0.5*dx);
k3 = ODE(x 0.5*dx,y k2*0.5*dx);
k4 = ODE(x dx,y k3*dx);
rk4= @(x,y,dx) y 1/6*(k1 2*(k2 k3) k4)*dx;
Итак, я сначала определяю ODE как анонимную функцию, затем я пытаюсь определить k из ODE и, наконец, RK4 из k.
Но это не работает. Есть какие-нибудь предложения, что делать?
Ответ №1:
Ваш k1
through k4
не определяется и не используется как функции. Когда вы объявляете k1 = ODE(x,y)
, это пытается вычислить ODE
функцию с помощью векторов x
, y
которые не определены. Вы, вероятно, хотите сказать, что :
k1 = @(x,y,dx) (ODE(x,y));
k2 = @(x,y,dx) (ODE(x 0.5*dx,y k1(x,y,dx)*0.5*dx));
k3 = @(x,y,dx) (ODE(x 0.5*dx,y k2(x,y,dx)*0.5*dx));
k4 = @(x,y,dx) (ODE(x dx,y k3(x,y,dx)*dx));
rk4= @(x,y,dx) (y 1/6*(k1(x,y,dx)
2*(k2(x,y,dx) k3(x,y,dx))
k4(x,y,dx))*dx);
Комментарии:
1. Большое спасибо, это сработало. И у меня есть вопрос. Если бы я хотел определить отдельный файл функции, вычисляющий rk4, что мне делать? Я имею в виду, что я не могу использовать @(..) в файлах функций. Какова замена?
2. Вы все равно можете определять анонимные функции в теле обычной функции, поэтому, если ваш файл функции начинается с
function rk4=RK4(ODE,x,y,dx)
, тогда телом может быть просто приведенный выше код, с@(x,y,dx)
удалением из строки rk4.