C++ 二分法求解方程的解

二分法是一种求解方程近似根的方法。对于一个函数 f(x)f(x),使用二分法求 f(x)f(x) 近似解的时候,我们先设定一个迭代区间(在这个题目上,我们之后给出了的两个初值决定的区间 [-20,20][?20,20]),区间两端自变量 xx 的值对应的 f(x)f(x) 值是异号的,之后我们会计算出两端 xx 的中点位置 x‘x′ 所对应的 f(x‘)f(x′) ,然后更新我们的迭代区间,确保对应的迭代区间的两端 xx 的值对应的 f(x)f(x) 值还会是异号的。

重复这个过程直到我们某一次中点值 x‘x′ 对应的 f(x‘) < \epsilonf(x′)<? (题目中可以直接用EPSILON)就可以将这个 x‘x′ 作为近似解返回给 main 函数了。

例如:

上面所示的一个迭代过程的第一次的迭代区间是 [a_1, b_1][a1?,b1?],取中点 b_2b2?,然后第二次的迭代区间是 [a_1, b_2][a1?,b2?],再取中点 a_2a2?,然后第三次的迭代区间是 [a_2, b_2][a2?,b2?],然后取 a_3a3?,然后第四次的迭代区间是 [a_3, b_2][a3?,b2?],再取红色中点 cc,我们得到发现 f(c)f(c) 的值已经小于 \epsilon?,输出 cc 作为近似解。

在这里,我们将用它实现对形如 px + q = 0px+q=0 的一元一次方程的求解。

在这里,你完成的程序将被输入两个正整数 pp 和 qq(你可以认为测评机给出的 0 < |p| \leq 10000<∣p∣≤1000且 0 < |q| \leq 10000<∣q∣≤1000),程序需要用二分法求出 px + q = 0px+q=0 的近似解。

输入格式

测评机会反复运行你的程序。每次程序运行时,输入为一行,包括一组被空格分隔开的符合描述的正整数 pp 和 qq。你可以认为输入数据构成的方程 px + q = 0px+q=0 都是有解且解在 [-20, 20][?20,20] 的区间内。

输出格式

输出为一行,包括一个数字。为方程 px + q = 0px+q=0 的近似解。请使用四舍五入的方式保留小数点后 44 位小数。

#include <cstdio>
#include <cmath>
#include<iostream>
#define EPSILON 1e-7
using namespace std;

double bisection(int p, int q, double(*func)(int, int, double));
double f(int p, int q, double x);
int main() {
	int p;
	int q;
	//scanf_s("%d %d", &p, &q);
	//printf_s("%.4lf\n", bisection(p, q, f));
	cin >> p >> q;
	cout << bisection(p, q, f) << endl;
	return 0;
}

double bisection(int p, int q, double(*func)(int, int, double)) {
	double m = -20.0;
	double n = 20.0;
	double  h = (m + n) / 2.0;
	double u = 0.0;
	while( abs((*func)(p, q, h))>EPSILON)
	{
		double z = (*func)(p, q, m);
		double y = (*func)(p, q, n);
	    u = (*func)(p, q, h);
		cout << u << endl;
		if (z > 0 && u > 0 || z < 0 && u < 0)
		{
			m = (m + n) / 2;
			n = n;
		}
		else
		{
			n = double(m + n) / 2;
			m = m;
		}

		h = (double)(m + n) / 2;	   

	}

	return h;

}

double f(int p, int q, double x) {
	return p * x + q;
}

  

原文地址:https://www.cnblogs.com/fuhang/p/8809848.html

时间: 2024-11-05 13:56:09

C++ 二分法求解方程的解的相关文章

C语言之基本算法23—二分法求方程近似根

//二分法! /* ======================================================== 题目:用二分法求解方程3x^3-2x^2-16=0的近似解. ========================================================= */ #include <stdio.h> #include <math.h> double hs(double t) { return 3*t*t*t-2*t*t-16;/

(hdu step 4.1.1)Can you solve this equation?(使用二分法来求解方程组的解)

题目: Can you solve this equation? Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 915 Accepted Submission(s): 436   Problem Description Now,given the equation 8*x^4 + 7*x^3 + 2*x^2 + 3*x + 6 == Y,c

遗传算法的简单应用-求解方程

上篇初识遗传算法讲述了遗传算法的基本思想,这篇博客就用遗传算法求解方程. 具体的如下: 求解方程 -x^3+7*x+13=0 在[3,4]区间的解,解精确到0.001,交叉概率0.7 变异概率0.01,迭代次数为100,字符编码长度为10(二进制编码) 首先简单的分析一下: 1.编码与解码 题目要求的是采用二进制的编码方式来实现,既然已经编码了,自然就需要解码,给定的10 位二进制编码表示的区间范围就是0~1023,题目的区间是[3,4]很自然的就能想到10位二进 制编码中的0表示是就是[3,4

方程的解题解和扩欧的一些总结

题目描述 给出一个二元一次方程ax+by=c,其中x.y是未知数,求它的正整数解的数量. 输入输出格式 输入格式: 第一行一个整数T,表示有T组数据.接下来T行,每行3个整数a.b.c. 输出格式: 输出T行,每行一个数,表示方程解的数量.如果正整数解的数量比65535还多输出"ZenMeZheMeDuo". 题解 这个题一看就要先用扩展欧几里得求出一组x最小的整数解然后再计算出所有的解. 代码 1 #include<bits/stdc++.h> 2 using names

Leetcode 640.求解方程

求解方程 求解一个给定的方程,将x以字符串"x=#value"的形式返回.该方程仅包含'+',' - '操作,变量 x 和其对应系数. 如果方程没有解,请返回"No solution". 如果方程有无限解,则返回"Infinite solutions". 如果方程中只有一个解,要保证返回值 x 是一个整数. 示例 1: 输入: "x+5-3+x=6+x-2" 输出: "x=2" 示例 2: 输入: &quo

用c语言求ax^2+bx+c=0方程的解

用c语言求ax^2+bx+c=0方程的解.#include <stdio.h>#include <math.h>#define m 0.000001int main(){     float a,b,c,x,x2,n,q,p;     scanf ("%f%f%f",&a,&b,&c);     n=b*b-4*a*c;     if ((a<m)&&(a>-m))     {         x=(-c)/b

牛顿法求解方程

目的:求解方程{\displaystyle f(x)=0}的根

UVA 10341- Solve It(二分+精度求解方程值)

Problem F Solve It Input: standard input Output: standard output Time Limit: 1 second Memory Limit: 32 MB Solve the equation: p*e-x+ q*sin(x) + r*cos(x) + s*tan(x) + t*x2 + u = 0 where 0 <= x <= 1. Input Input consists of multiple test cases and ter

用弦截法求解方程的根

//弦截法求解方程的根 //要求:输入左右两个端点x值 //结果:在一定精度范围内求解出方程的根 //难点:1)推导出x处的横坐标的求解公式 2)迭代掉原来的左端点或者右端点 #include "pch.h" #include <iostream> #include <cmath> #include <iomanip> using namespace std; double f(double x); double xpoint(double x1,