【问题标题】:Function m-files with loops带循环的函数 m 文件
【发布时间】:2015-10-04 20:37:18
【问题描述】:

我需要创建一个名为 newsign 的函数来输入一个

函数句柄(f)和

一个实数、正数和小数 (d)。

我可以假设 f(0) 不是 0,f(x) 在 [0,∞) 上是连续的,并且 f(x) 在 x > 0 处穿过 x 轴

例如

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

理想情况下,我希望 i 从 1:infinity 开始计数,只计算整数,但我不确定如何执行此操作,或者我什至是否需要 for 循环。

谢谢! 例如,如果您插入

   newsign(@(x) 9-x-x^2,0.1)

答案是

  2.600000000000001

【问题讨论】:

  • 我的回答有帮助吗?

标签: matlab for-loop while-loop logic


【解决方案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

...正如你所料。

【讨论】:

    猜你喜欢
    • 2021-09-08
    • 2012-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-26
    • 2016-10-05
    相关资源
    最近更新 更多