所以我在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”的参数。
当df / dx = df / dy = 0时,这为我提供了正确的x和y值。
我要针对给定的函数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