c语言三分法
这个呀,楼主很有创造力,其实算法都是人设计的嘛,你想有就可以有的。
具体思想应该跟二分查找法差不多吧。给出n个已经排好序的数,在n/3和2n/3处各取一个数,跟待查的数比较,确定待查数所在的范围。编程复杂度应该比二分法大一些,因为需要考虑的情况很多
什么是二分法
二分法的思想为:首先确定有根区间,将区间二等分,通过判断F(x)的符号和单调性,逐步将有根区间缩小,直至有根区间在所求范围内,便可求出满足精度要求的近似根。用二分法的条件f(a)f(b)<0表明二分法求函数的近似零点都是指变号零点。
一般地,对于函数f(x),如果存在实数c,当x=c时f(c)=0,那么把x=c叫做函数f(x)的零点。
解方程即要求f(x)的所有零点。
二分法的概念
二分法(Bisection method) 即一分为二的方法. 设[a,b]为R的闭区间. 逐次二分法就是造出如下的区间序列([an,bn]):a0=a,b0=b,且对任一自然数n,[an+1,bn+1]或者等于[an,cn],或者等于[cn,bn],其中cn表示[an,bn]的中点.[2]
典型算法
算法:当数据量很大适宜采用该方法。采用二分法查找时,数据需是排好序的。
基本思想:假设数据是按升序排序的,对于给定值key,从序列的中间位置k开始比较,
如果当前位置arr[k]值等于key,则查找成功;
若key小于当前位置值arr[k],则在数列的前半段中查找,arr[low,mid-1];
若key大于当前位置值arr[k],则在数列的后半段中继续查找arr[mid+1,high],
直到找到为止,时间复杂度:O(log(n))[3]。
求法
给定精确度ξ,用二分法求函数f(x)零点近似值的步骤如下:
1 确定区间[a,b],验证f(a)·f(b)<0,给定精确度ξ.
2 求区间(a,b)的中点c.
3 计算f(c).
(1) 若f(c)=0,则c就是函数的零点;
(2) 若f(a)·f(c)<0,则令b=c;
(3) 若f(c)·f(b)<0,则令a=c.
(4) 判断是否达到精确度ξ:即若|a-b|<ξ,则得到零点近似值a(或b),否则重复2-4.
把函数f(x)的零点所在的区间[a,b](满足f(a)●f(b)<0)“一分为二”,得到[a,m]和[m,b]。
根据“f(a)●f(m)<0”是否成立,取出零点所在的区间[a,m]或[m,b],仍记为[a,b]。所对得的区间[a,b]重复上述步骤,直到包含零点的区间[a,b]“足够小”,则[a,b]内的数可以作为方程的近似解。
请帮我找一下求解一个用二分法求方程近似解的c语言代码的问题
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
/*2^x+3x-7*/
int main(void)
{
float a=0.0f;
float b=2.0f;
float x=0.0f;
float y=1.0f;
float y_1=0.0f;
float y_2=0.0f;
for(;b-a>0.1;)/*二分法求近似解*/
{
x=(a+b)/2.0f;
y=pow(2,x)+3.0f*x-7.0f;
y_1=pow(2,a)+3.0f*a-7.0f;
y_2=pow(2,b)+3.0f*b-7.0f; // pow返回的值不能再给它赋值,估计你是把+写成=了
if(y*y_1<0.0f)
b=x;
if(y*y_2<0.0f)
a=x;
}
printf("x=%f",x);
system("pause");
return 0;
}
还没有评论,来说两句吧...