信息学奥赛一本通:1241:二分法求函数的零点

1241:二分法求函数的零点


时间限制: 1000 ms         内存限制: 65536 KB
提交数: 10342     通过数: 6391

【题目描述】

有函数:f(x)=x5−15x4+85x3−225x2+274x−121

已知f(1.5)>0,f(2.4)<0 且方程f(x)=0 在区间[1.5,2.4] 有且只有一个根,请用二分法求出该根。

【输入】

(无)

【输出】

该方程在区间[1.5,2.4]中的根。要求四舍五入到小数点后6位。

【输入样例】

(无)

【输出样例】

(无)

程序没这么长,能学到这的应都看得懂的,归并算法没用。

只用了主函数和一个f函数

#include<bits/stdc++.h>
using namespace std;
#define MAX 100009
int n,m;
long long sum=0;
long long t=1,a[MAX],b[MAX];
void merge(long long a[],int s,int m,int e)
{
	int pb=0,p1=s,p2=m+1;
	while(p1<=m&&p2<=e)
	{
		if(a[p2]<a[p1])
		{
		b[pb++]=a[p2++];
		}
		else
		b[pb++]=a[p1++];
	}
	while(p1<=m)
	b[pb++]=a[p1++];
	while(p2<=e)
	b[pb++]=a[p2++];
	for(int i=0;i<=e-s;i++)
	a[s+i]=b[i];
 } 
 void mergesort(long long a[],int s,int e)
 {
 	if(s<e)
 	{
 		int m=s+(e-s)/2;
 		mergesort(a,s,m);
 		mergesort(a,m+1,e);
 		merge(a,s,m,e);
	 }
 }
long long numsearch(long long a[],int size,long long t)
 {
 	int l=0,r=size-1;
	 long long lastpos=-1;
 	while(l<=r)
 	{
 		int mid=l+(r-l)/2;
 		if(a[mid]>t)
 		r=mid-1;
 		else
 		{
 			lastpos=mid;
 			l=mid+1;
		 }
	 }
	 return lastpos;
 	 }
 	 long long p,q,x;
double  EPS=1e-7;
double f(double x){
 		return x*x*x*x*x-15*x*x*x*x+85*x*x*x-225*x*x+274*x-121; 
	 }
 int main()
 {
 	double root,x1=1.5,x2=2.4,y;
	 root=x1+(x2-x1)/2;
	 y=f(root);
	 while(fabs(y)>EPS) 
	 {
	 	if(y>0)
	 	x1=root;
	 	else
	 	x2=root;
	 	root=x1+(x2-x1)/2;
	 	y=f(root);
	 }
	 printf("%.6lf",root);
	 	 return 0;
 }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
; end else begin if (pc_src) begin pc <= jump_target; end else begin pc <= pc + 4; end end end // Connect ALU inputs always @ (posedge clk)二分法是一种常用的函数零点的方法。具体实现如下: 1. 确定一个 begin if (reset) begin alu_in1 <= 32'h00000000; alu_in2 <= 区间 [a, b],使得 f(a) 和 f(b) 异号,即 f(a) * f(b) <32'h00000000; end else begin if (opcode == 6'b000010) begin alu 0。 2. 然后取区间的中点 c = (a + b) / 2,计算 f(c)_in1 <= pc + 4; alu_in2 <= 32'h00000000; end else begin 的值。 3. 如果 f(c) 等于 0,则 c 就是函数零点;否则,根据 f(c) 与 f(a) 或 f(b) 的符号确定新的区间: - 若 f(c) 与 f(a alu_in1 <= reg_file[rs]; alu_in2 <= immediate; end end end // Connect data memory inputs always @ (posedge clk) begin if (reset) begin alu_in2 <= 32'h000) 同号,则零点在区间 [c, b] 中,令 a = c; - 若 f(c) 00000; end else begin alu_in2 <= reg_file[rt]; end end // Connect register与 f(b) 同号,则零点在区间 [a, c] 中,令 b = c。 4. 重复 file output to ALU input always @ (posedge clk) begin if (reset) begin alu_in1 <=步骤 2 和 3,直到满足终止条件为止,比如区间长度小于某个阈值 32'h00000000; end else begin alu_in1 <= reg_file[rs]; end end或者迭代次数超过某个值。 需要注意的是,二分法只能用于单峰函数或者 // Connect register file output to data memory input always @ (posedge clk) begin if (reset) begin al单调函数零点解。此外,使用二分法解时需要注意避免浮点数误差问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值