Попытка создать анонимную функцию внутри анонимной функции в MATLAB

#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.