Итак, у меня есть три отдельные функции в MATLAB, где у каждой есть свое предназначение.
Первый вычисляет частную производную
Второй находит корни для системы двух уравнений и двух переменных.
Третий должен найти критическую точку.
Я пытался делать все по отдельности, и это сработало. Однако, когда я делаю это через функцию 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