您现在的位置是:首页 > 正文

112.求解非线性方程

2024-02-01 01:21:06阅读 2
#include "math.h"
#include "stdio.h"


int BinSearchRoot(a,b,h,eps,x,m) /*用二法计算非线性方程的实根*/
int m;
/*参数意义:
a    要求的根的下界
b    要求的根的上界,即:所求的根落在区间 [a,b]之内
h    递进的步长
eps  精度
x    根的值
m    预计的根的个数*/
double a,b,h,eps,x[];
{ 
	extern double Equation(); /*要求解的非线性方程*/
    int n,js;
    double z,y,z1,y1,z0,y0;
    n=0; z=a; y=Equation(z);
    while ((z<=b+h/2.0)&&(n!=m)) /*对给定步长的子区间进行搜索*/
	{ 
		if (fabs(y)<eps)  /*当前的判定点是方程的根*/
		{ 
			n=n+1; 
			x[n-1]=z;
            z=z+h/2.0; 
            y=Equation(z);
		}
        else /*当前点不是方程的根*/
		{ 
			z1=z+h; 
			y1=Equation(z1);
			if (fabs(y1)<eps) /*下一个点是方程的根*/
			{ 
				n=n+1;
				x[n-1]=z1;
				z=z1+h/2.0;
				y=Equation(z);
			}
			else if (y*y1>0.0) /*该区间内无根*/
			{ y=y1; z=z1;}
			else   /*该区间内有根*/
			{ 
				js=0;/*标志,0表示未找到根,1表示已经确定了根*/
				while (js==0)
				{ 
					if (fabs(z1-z)<eps) /*区间的长度小于给定的精度,可以当作已经找到了根*/
					{ 
						n=n+1;  
						x[n-1]=(z1+z)/2.0; /*把区间的中位值作为根*/
						z=z1+h/2.0; /*把寻找的位置放到下一个区间内*/
						y=Equation(z);
						js=1; /*在当前区间内已经找到了根*/
					}
					else /*区间比给定的精度大,则进行二分*/
					{ 
						z0=(z1+z)/2.0;  /*区间二分*/ 
						y0=Equation(z0);
						if (fabs(y0)<eps) /*z0位置为根*/
						{ 
							x[n]=z0; 
							n=n+1; 
							js=1;
							z=z0+h/2.0; 
							y=Equation(z);
						}
						else if ((y*y0)<0.0) /*[z,z0]内有根*/
						{ z1=z0; y1=y0;} 
						else { z=z0; y=y0;}
					}
				}
			}
		}
	}
    return(n); /*返回根的个数*/
}
main()
{
	int i,n;
    static int m=6;
    static double x[6];
    clrscr();
    puts("This is a program to solve Nonlinear function\n   by Binary Divisive Procedure.");
    puts("\n The Nonlinear function is:");
    puts("\n f(x)=(((((x-5.0)*x+3.0)*x+1.0)*x-7.0)*x+7.0)*x-20.0\n");
    n=BinSearchRoot(-2.0,5.0,0.2,0.000001,x,m);
    puts("\n >> Solve successfully!\n >> The results are:");
    printf(" >> The function has %d roots, they are:\n",n);/*输出根的个数*/
    for (i=0; i<=n-1; i++)
		printf(" >> x(%d)=%13.7e\n",i,x[i]);
    printf("\n Press any key to quit...\n");
    getch();

}

double Equation(x)
double x;
{
	double z;
	z=(((((x-5.0)*x+3.0)*x+1.0)*x-7.0)*x+7.0)*x-20.0;
	return(z);
}

网站文章

  • Spring-AOP深度学习

    AOP是一种编程范式,旨在将不同关注点(如日志记录、事务管理、性能监视等)与应用程序的核心业务逻辑分离开来。它通过在关注点与业务逻辑之间的交叉点(称为切点)上插入代码来实现这一目标。切点(Pointcut):切点是您选择在哪里插入额外代码的规则或条件。通常,它是一个方法的签名或一个特定的类。通知(Advice):通知是在切点上执行的额外代码块。

    2024-02-01 01:21:01
  • 【SQL基础】查询数据 —— 排序

    【SQL基础】查询数据 —— 排序

    排序 查询结果集通常是按照id排序的,也就是根据主键排序。如果要根据其他条件排序,可以使用ORDER BY子句 -- 按score从低到高排序 SELECT id, name, gender, score FROM students ORDER BY score; 查询结果 如果想从高到低排序,加上DESC -- 按score从高到低排序 SELECT id, name, gender, ...

    2024-02-01 01:20:55
  • 在Ubuntu下,从零开始写操作系统(0)-笔记

    1.安装Ubuntu 16.04操作系统 32位,因为16.04版本是最稳定的版本。安装方法请百度。2.安装bochs; 命令:sudo apt-get install bochs3.安装gcc;可能系统没有自带gcc, 命令:sudo apt-get install gcc编写如下代码//16位的代码段.code16//代码起始.text mov %cs,%...

    2024-02-01 01:20:17
  • 第十三周总结

    这周重点了解水王的题目,去借鉴别人的代码去修改这一周在代码上花费的时间加起来差不多16个小时。共写了1000行代码。转载于:https://www.cnblogs.com/lishengming00/p/11071283.html...

    2024-02-01 01:20:11
  • 众多互联网薪资一览表【技术岗】

    众多互联网薪资一览表【技术岗】

    我们平常戏称的“程序猿”、“码农”、“工程狮”都属于技术岗位,大家眼中以“格子衫+牛仔裤”为标配的直男一族。但相对来讲,技术岗位算是互联网行业薪资水平最高的岗位。*图片来源:网络岗位职责:把产品的想法...

    2024-02-01 01:20:04
  • keepalive安装部署步骤

    keepalive VRRP

    2024-02-01 01:19:38
  • Nginx配置:真实IP设置到请求头提供给应用

    Nginx配置:真实IP设置到请求头提供给应用

    项目采用前后端分离后,中间用Nginx进行请求转发,但是如此以来,后台应用获取到的客户端IP地址就总是127.0.0.1(Nginx和后台应用在同一台机器,获取到的总是Nginx的转发的请求IP)。其...

    2024-02-01 01:19:32
  • WCF Resource

    What is WCF? Writing the WCF Hello World App Writing your first WCF client转载于:https://www.cnblogs.com/javafun/archive/2008/04/13/1151405.html

    2024-02-01 01:19:25
  • android lint工作机制,Android架构

    android lint工作机制,Android架构

    MVCmvc model view controller 模式视图控制器M: 业务逻辑处理V:处理数据显示的部分C:Activity处理用户交互的问题,中间桥梁的作用,解耦的作用。特点:耦合性低扩展性...

    2024-02-01 01:18:50
  • No.2-VulnHub-Lampiao渗透学习

    No.2-VulnHub-Lampiao渗透学习

    VulnHub-Lampiao渗透学习 一、前言 靶机地址:https://www.vulnhub.com/entry/lampiao-1,249/ 难度:简单 目标:获取root权限,并获取到fla...

    2024-02-01 01:18:43