Как исправить нескончаемое время выполнения в MATLAB - PullRequest
0 голосов
/ 12 апреля 2019

Итак, у меня есть три отдельные функции в MATLAB, где у каждой есть свое предназначение.

  1. Первый вычисляет частную производную

  2. Второй находит корни для системы двух уравнений и двух переменных.

  3. Третий должен найти критическую точку.

Я пытался делать все по отдельности, и это сработало. Однако, когда я делаю это через функцию CriticalPoint, она просто продолжает работать (в левом нижнем углу написано «занято»).

Я пытался решить эту проблему вручную. Это означает, что я использовал каждую функцию по назначению, сохранил значения в своем рабочем пространстве и использовал для следующей функции.

Единственное отличие состоит в том, как я относился к своим частям.

У меня есть функция, которая выполняет оценку частной производной в точке [x, y].

 derivative = Pderiv(f, a, b, i) 

%The i denotes if the partial derivative is take with respect to x or y
%where if i == 1, then it means that partial derivative is with respect to
%x and if i == 2 then  it is with respect to y

Что я сделал по-другому, так это то, что я нашел частную производную для f (x, y) вручную, используя ручку и бумагу.

т. Е.

df / dx и df / dy (это частичные извинения за неиспользование правильного символа)

А потом я вставил его в свою функцию:

[x0,y0] = MyNewton(f, g, a, b)

Где df / dx - аргумент для «f», а df / dy - аргумент для «g».

Это дает мне правильные значения x & y, когда df / dx = df / dy = 0.

Я хочу, чтобы это было сделано для заданной функции f (x, y)

Я хочу найти частную производную, где входные значения по-прежнему представлены x и y.

Мой учитель сказал мне следующее выражение:

g=@(x,y)NPderiv(f,x,y,1);

было бы достаточно. Это правда? Так как это работает, когда я делаю это вручную, но программа работает вечно, когда я определяю свою функцию g, как указано выше.

Я не уверен, что это уместно, но вот мой код для частной производной:

function derivative = NPderiv(f, a, b, i)

h = 0.0000001;
fn=zeros(1,2);

if i == 1
fn(i) = (f(a+h,b)-f(a,b))/h;


elseif i==2

    fn(i) = (f(a,b+h)-f(a,b))/h;

end

derivative = fn(i);

end

функция для моей функции критической точки:

function [x,y] = CriticalPoint(f, a, b)

g=@(x,y)NPderiv(f,x,y,1); %partial derivative for f(x,y) with respect to x
z=@(x,y)NPderiv(f,x,y,2);%partial derivative for f(x,y) with respect to y


[x,y]=MyNewton(g,z,a,b);




end

Функция MyNewton:

function [x0,y0] = MyNewton(f, g, a, b)

y0 = b; 
x0 = a;

tol = 1e-18;

resf = tol + 1; 
resg = tol + 1;

 while  resf > tol && resg > tol

  dfdx = NPderiv(f, x0, y0, 1);  
  dfdy = NPderiv(f, x0, y0, 2);
  dgdx = NPderiv(g, x0, y0, 1);
  dgdy = NPderiv(g, x0, y0, 2);

  jf1 = [f(x0,y0) dfdy; ...
       g(x0,y0) dgdy];

  jg1 = [dfdx f(x0,y0); ...
        dgdx g(x0,y0)]; 

  j2 = [dfdx dfdy; ...
        dgdx dgdy];

  jx = det(jf1)./det(j2); 
  jy = det(jg1)./det(j2); 

  x0 = x0 - jx; 
  y0 = y0 - jy;

  resf = abs(f(x0,y0));
  resg = abs(g(x0,y0));
end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...