[英]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.