gpt4 book ai didi

c - Regula-Falsi 算法?

转载 作者:太空狗 更新时间:2023-10-29 15:24:15 27 4
gpt4 key购买 nike

我正在尝试实现 Regula-Falsi 算法来求解 2(x^3)-x-2 的方程但问题是变量 c 值保持不变并且没有改变,即使我的代码应该改变它。

#include<math.h>
#include<stdio.h>


float fonc(float x)
{
int result;
result=2*(pow(x,3))-x-2;
return result;
}

int main(void)
{
float eps=pow(10,-4);
int i=0;
float a,b,c;
a=1;
b=2;
do
{
c=((a*fonc(b))-(b*fonc(a)))/((fonc(b)-fonc(a)));
if(fonc(c)*fonc(a)<0)
{
b=c;
}
else
{
a=c;
}
i++;
printf("\n%f",c);
}
while(fabs(b-c)>eps);

printf("le nombre d'itération %d",i);
}

最佳答案

即使所有数据类型都是合适的,所呈现的算法会出现什么问题?

与二分法相比,纯正则 falsi 不会强制区间长度变为零。如果使用单调凸函数,则迭代将停滞在仅改变具有几何收敛的区间的一侧。任何足够平滑的函数最终都会在剩余的包围间隔内具有这些属性。

要正确捕获此行为,应在计算后立即将中点 c 与区间两端的 ab 进行比较。作为奖励,检查 c 处的值是否足够小,如果为真,则无论距离区间末端有多远,也中断迭代。


有许多简单的技巧可以强制间隔长度为零。复杂的技巧导致了布伦特的方法。简单的技巧之一是伊利诺斯变体。在这些变体中,中点被认为是凸和

    c = |f(b)|/(|f(a)|+|f(b)|) * a + |f(a)|/(|f(a)|+|f(b)|) * b

因为f(a)f(b)的符号相反,所以这和原来的公式是等价的。如果边 b 没有改变,它在这个凸和中的重要性通过减小函数值 f(b) 来增加,即将它乘以额外的权重因子。这会将中点 c 移向 b,这将在非常少的步骤中找到将替换 b 的中点。


以下是伊利诺斯变体的 regula falsi(或假位置方法)的实现。该算法在 6 次迭代中找到函数值为 2.2e-6 且封闭区间长度为 6e-7 的解。

#include<math.h>
#include<stdio.h>


float fonc(float x)
{
return (2*x*x-1)*x-2;
}

int main(void)
{
float eps=1e-6;
int i=0;
float a=1, fa = fonc(a);
float b=2, fb = fonc(b);

printf("\na=%10.7f b=%10.7f fa=%10.7f fb=%10.7f\n------\n",a,b, fa,fb);

if(signbit(fb)==signbit(fa)) {
printf("Attention, les valeurs initiales de 'fonc' n'ont pas de signe opposeés!\n");

}
do
{
float c=(a*fb-b*fa)/(fb-fa), fc = fonc(c);

if( signbit(fc)!=signbit(fa) )
{
b=a; fb=fa;
}
else
{
fb *= 0.5;
}
a=c; fa=fc;
i++;
printf("\na=c=%10.7f b=%10.7f fa=fc=%10.7f fb=%10.7f",c,b, fc,fb);

if(fabs(fc)<eps) break;
}
while(fabs(b-a)>eps);

printf("\nle nombre d'itération %d\n",i);

return 0;
}

输出是

     a= 1.0000000 b= 2.0000000  fa=-1.0000000  fb=12.0000000
------

a=c= 1.0769231 b= 2.0000000 fa=fc=-0.5789710 fb= 6.0000000
a=c= 1.1581569 b= 2.0000000 fa=fc=-0.0512219 fb= 3.0000000
a=c= 1.1722891 b= 1.1581569 fa=fc= 0.0497752 fb=-0.0512219
a=c= 1.1653242 b= 1.1722891 fa=fc=-0.0003491 fb= 0.0497752
a=c= 1.1653727 b= 1.1722891 fa=fc=-0.0000022 fb= 0.0248876
a=c= 1.1653733 b= 1.1653727 fa=fc= 0.0000020 fb=-0.0000022
le nombre d'itération 6

关于c - Regula-Falsi 算法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22273751/

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