如何在MATLAB中修复永无止境的运行时

时间:2019-04-12 01:57:33

标签: matlab function

所以我在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”的参数。

当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

0 个答案:

没有答案