我需要创建一个名为newsign的函数来输入
函数句柄(f)和
真实,正面和小数字(d)。
我可以假设f(0)不是0,f(x)在[0,∞)上是连续的,并且f(x)在x> x的某个地方与x轴交叉。 0
例如
9-x-x^2
我的函数需要使用while循环来计算
f(x) at x=0,x=d,x=2d,x=3d.....x=
依此类推,直到f(x)和f(0)具有相反符号的第一个x值,然后返回x的值
这是我到目前为止所拥有的
function r=newsign(f,d)
for i = 1:1000
while (f(i*d) and f(0) ARE DIFFERENT SIGNS)
%I don't know how to do this
f=f(i*d)
r=(i*d)
end
end
end
理想情况下,我希望我从1计算:无穷大只计算整数,但我不知道该怎么做,或者我甚至需要一个for循环。
谢谢! 例如,如果你插入
newsign(@(x) 9-x-x^2,0.1)
答案将是
2.600000000000001
答案 0 :(得分:1)
好的,一方面,您正在将for
循环和while
循环嵌套在一起。如果您执行此操作,索引i
将始终保持在i=1
,并且while
循环将永远不会停止执行,因为您使用x=i*d
的相同点并且它永远不会更改
因此,摆脱for
循环 - 只需使用while
,因为您不知道它何时会终止。此外,如果我可以推荐一些内容,请使用sign
或signum函数检查数字的符号。但是,如果您不想使用sign
,一个常见的技巧是将两个数字相乘并检查它是否小于0.如果两个数字的符号相同,则其产品将大于0.如果任何一个符号相反,则乘积应小于0.实际上,这是执行根估计时二分法中常用的。
因此,您将循环并继续以d
的倍数递增,直到 f(x)
和f(0)
之间的符号不等,然后退出。
因此:
function r=newsign(f,d)
ii = 1; %// Beginning index
while sign(f(ii*d)) == sign(f(0)) %// Loop until unequal signs
%while f(ii*d)*f(0) > 0 %// Can also do this too
ii = ii + 1; %// Go to next index
r = ii*d; %// Remember value of x
end
因此,此代码应保持循环,直到f(x)
和f(0)
符号不相等。
仔细检查你的例子,我们得到:
>> newsign(@(x) 9-x-x^2,0.1)
ans =
2.6000
......就像你期望的那样。