包含循环

时间:2015-10-04 20:37:18

标签: matlab for-loop while-loop logic

我需要创建一个名为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

1 个答案:

答案 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

......就像你期望的那样。