二分法求解方程的根java_C语言二分法求解方程根的两种方法
本文實例為大家分享了C語言二分法求解方程根的具體代碼,供大家參考,具體內容如下
對于二分法求根,其實和弦截法思想很像,甚至更簡單。
原理:先看如下的圖
A,B兩個點為跟的一個邊界,通過一直縮小跟的邊界,從而獲取跟的值。
(1)知道函數(即方程的式子),這個好說,題上都有
(2)循環的輸入A,B的橫坐標的值,即x1,x2的初值,直到f(x1)與f(x2)的乘積為負數才停止。(必須保證方程的跟在(x1,x2)區間)這樣的x1,x2的初值才有意義。
(3)令xx=(x1+x2)/2;(即中值),若f(xx)*f(x1)>0此刻證明了x1要被xx替代了,即區間變成了(xx,x2);。若f(xx)*f(x2)>0此刻證明了x2要被xx替代了,即區間變成了(x1,xx);大家可以用上面的圖試一下就知道了,很好理解的。
(4)那么什么時候結束呢,這就是一個精度的問題了,看你把精度設成什么樣子,最精準的方程跟的函數值是0,那么就用f(xx)與0比較,相差在自己設置的精度(一般是10的-6次方,C語言中寫作:1e-6)以內,則可以把xx近似當做是方程的跟。
下面用代碼實現:
第一種是直接的,第二種是可移植性的(即使方程改變需要修改的地方很少,而前者則需要修改很多),第二種用函數指針實現。
第一種:
#include
#include
#include
#include
using namespace std;
double f(double x)
{
return (x*x*x-3*x*x+3*x-1);
}
int main()
{
double x1,x2,xx;//x1,x2代表區間左右邊界,xx代表方程跟的值
do
{
scanf("%lf%lf",&x1,&x2);
}
while(f(x1)*f(x2)>0);//保證f(x1)和f(x2)是異號,這樣才可以進行下一步的精準區間,否則,重新輸入x1,x2的值
do
{
xx=(x1+x2)/2;
if(f(xx)*f(x1)>0)
x1=xx;
else
x2=xx;
}
while(fabs(f(xx))>=1e-7);//le-6代表1*10的-6次方,它的值將影響到跟的準確度的問題
printf("%.2lf\n",xx);
return 0;
}
第二種:
#include
#include
#include
#include
using namespace std;
double f(double x)
{
return (x*x*x-3*x*x+3*x-1);
}
double erfen(double x1,double x2,double (*p)(double))//double (*p)(double)為形參,相當于函數別名
{
double xx;
do
{
xx=(x1+x2)/2;
if((*p)(xx)*(*p)(x1)>0)
x1=xx;
else
x2=xx;
}while(fabs((*p)(xx))>=1e-7);//le-7代表1*10的-6次方,它的值將影響到跟的準確度的問題
return xx;
}
int main()
{
double x1,x2;
double f(double);
double (*p)(double);
p=f;
do
{
scanf("%lf%lf",&x1,&x2);
}
while((*p)(x1)*(*p)(x2)>0);//保證f(x1)和f(x2)是異號,這樣才可以進行下一步的精準區間,否則,重新輸入x1,x2的值
printf("%.2lf\n",erfen(x1,x2,f));
return 0;
}
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
總結
以上是生活随笔為你收集整理的二分法求解方程的根java_C语言二分法求解方程根的两种方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 手机调试java代码_【奇技淫巧】Int
- 下一篇: java io系统_java中的io系统