繁体   English   中英

我需要帮助来克服我的牛顿算法中的错误

[英]I need help overcoming an error in my Newton Algorithm

我叫柯蒂斯,我是日内瓦大学生物化学专业的一年级学生。 我需要一些帮助来完成我的NEWTON算法的代码。 这是我们秋季学期数学考试的一项奖励练习,我们可以上交也可以不上交。 通常人们会复制粘贴,但我决定坐下来复习理论,并在左右中间寻求帮助。 相信我,过去3周(初学者)我一直在从事这项工作,但我的技能却逐渐提高,但是我已经达到了极限。

这是我的代码:

主要功能

f=function(x){ out=(2/(3))*exp(x^3)-(10)*log(x) return(out) }

一阶导数

fp=function(x){ out=(2)*(x^2)*exp(x^3)-(10/x) return(out) }

第二衍生品

fpp=function(x){ out=(4)*(x)*exp(x^3)+(6)*(x^4)*exp(x^3)+(10/x^2) return(out) }

我试图用牛顿算法找到我的一阶导数“ fp”的“零”:

牛顿算法

newbon=function(x0,epsi,f,fp){

## where "a" corresponds to x^n and

## "b" corresponds to x^n+1

## We are looking for x^n+1 such that f(x^n+1)=0

## NB: fp(a)*(a-b)=f(b)-f(a) when f(b)=0 

  a=x0
  b=(fp(a)*a-f(a))/fp(a)
while(abs(-fp(a)*(b-a))>epsi){
  a=b
  b=(fp(a)*a-f(a))/fp(a)
} 
  out=NULL 
  out=a
return(out)
}

我必须承认,我的算法非常拥挤,而且一直想让它开始工作。 但是,我总是收到相同的错误消息:

错误信息

Erreur dans while (abs(-fp(a) * (b - a)) > epsi) { : 
  valeur manquante là où TRUE / FALSE est requis
De plus : Message d'avis :
In log(x) : production de NaN

请原谅法国人; 这是我的学习语言。 坦率地说,我不介意我没有获得加分,真正重要的是要了解为什么它不起作用以及缺少什么条件。

您的帮助将不胜感激。

柯蒂斯·莫约

log返回NaN ,所以我猜您以某种方式将其输入负值。

所以我可以从中收集到的是fp是一个包含日志的函数,因此可能是function(x){ out=(2/(3))*exp(x^3)-(10)*log(x) return(out) }
它正在接受一个否定参数,该参数返回NaN 不能将其与epsi进行比较,因此不向循环条件返回布尔值。

NaN也可能更早产生,在b=(fp(a)*af(a))/fp(a) ,其中f被调用,因为那是应该包含log ,并导致上述情况问题在那里。

有了更多信息以及您的x0,epsi,f,fp参数是什么,我可以在Matlab中尝试使用(或可能使用的是任何方法)


请记住,实现牛顿方法的标准方法很简单

while (abs(f(x)) > TOL)
  x = x - f(x)/fp(x);

寻找f的根


这是我自己用于作业的内容:

%x0 is a guess, a,b are bounds, f is the function, g is the derivative, TOL is epsi
function [x, flag] = SafeNewton1D(f, g, x0, a, b, TOL)
x = x0;
  while (abs(f(x)) > TOL)
    x = x - f(x)/g(x);
    if (x < a || b < x)
       %value does not fall between a and b, shorten bounds and then guess
       %again from the midpoint.
       midpoint = a + (b - a)/2;
       if (sign(f(a)) == sign(f(midpoint)))
           a = midpoint;
       else
           b = midpoint;
       end
       x = a + (b - a)/2;
    else
        %value falls between a and b, so may as well shorten the bounds.
       if (sign(f(x)) ==  sign(f(a)))
           a = x; 
       else
           b = x;
       end

    end

  end
end

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM