gpt4 book ai didi

c - 二分法——循环中断

转载 作者:行者123 更新时间:2023-11-30 14:40:42 27 4
gpt4 key购买 nike

一旦找到正确的根(r3 的值 == 0),退出 while 循环就会遇到问题。我应该在某个地方休息吗?如果是的话——在哪里?

我已经尝试过使用 if、else if 和 else 语句的条件。尝试放置中断;在不同的地方,但无法以这样的方式获得它,即我仍然收到正确的输出(主要是它在第一次迭代后中断)

float fun(float t);
float fun(float t)
{
double result;
result = (cos(t) - t); //my function
return result;
}

void main()
{
float a; float b; float error; float root;
scanf("%f %f %f", &a, &b, &error); //scanning for range of bisection and maximum allowed error
int i = 0;

if (fun(a) == 0)
{
root = a;
printf("The root is : %f", a);
}
else if (fun(b) == 0)
{
root = b;
printf("The root is : %f", b);
}
else
{
while (i < 100)
{
float r1 = fun(a);
float r2 = fun(b);
root = (a+b)/2.0;
float r3 = fun(root);
printf("The root after %d iteration is %f\n",i,root);
if(r1*r3 < 0 && r3 != 0) //intermediate value theorem
{
b = root;
}
else if(r3*r2 < 0 && r3 != 0) //intermediate value theorem
{
a = root;
}
i++;
int *p = &i; //not necessary at this moment
}
}
printf("The approximation to the root is %f",root);

预期的结果是程序应该在第一次 r3 == 0 时结束,因为这表明使用二分法找到的根是正确的。因此,最后一次迭代应该是具有正确的根最终值的迭代......

最佳答案

首先,一个条件 r1 * r3 < 0意味着r3 != 0 (如果 r3 == 0 乘积也为 0);无需测试。

其次, float 不太可能等于任何值,包括 0。只要您对结果不满意,就应该运行循环。安error参数的存在是有原因的。

第三,a的不幸选择和b可能永远不会给你一个结果: if fun(a), fun(b), fun((a+b)/2)都有相同的符号,a也不b永远改变。

也就是说,正确的代码应该是这样的

    if (fun(a) * fun(b) > 0) {
bail_out("Root may not exist\n");
}

while (b - a > error) /* see note below */ {
mid = a + (b - a)/2;
if (fun(a) * fun(mid) > 0) {
a = mid;
} else {
b = mid;
}
}

注意:上述条件取决于错误的语义。在某些情况下(abs(fun(mid)) > error)可能更可取。

关于c - 二分法——循环中断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55408895/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com