【计算方法】实验一 非线性方程求根数值解法

2023-11-09 16:50

本文主要是介绍【计算方法】实验一 非线性方程求根数值解法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

实验目的

(1)通过对二分法与牛顿迭代法做编程练习和上机运算,进一步体会二分法和牛顿法的不同。
(2)编写割线迭代法的程序,求非线性方程的解,并于牛顿迭代法作比较。

实验内容

1、用牛顿迭代法求下列方程的根
(1) x^2-e^x=0
(2) 〖xe〗^x-1=0
(3) lgx+x-2=0
2、编写割线法程序求解第一问的方程

/* 牛顿迭代法的代码实现* 数值分析* 计科 1604 王宇晨 10430416414*/#include<iostream>
#include<string>
#include<cmath>
using namespace std;const double e = 2.718281818284;
const double eps = 1e-6;//求导数 X = x - f(x)/f'(x)
double f1(double x){double a = pow(e,x);return x-(x*x-a)/(2*x-a);
}
double f2(double x){double a = pow(e,x);return x-(x*a-1)/(a*x+a);
}
double f3(double x){double a = x*log(10);return x-(log10(x) + x - 2)/( 1/a + 1);
}
void NewtonIterationMethod1(double x,double d){double a = x;double b = f1(a);int k=0; //记录循环的次数while(((a-b)>d) || ((a-b)<-1*d)){//cout<< a <<endl;a = b;b = f1(a);k ++;if(k>100){cout<<"迭代失败!(函数不收敛)"<<endl;return ;}}cout<< b <<endl;return;
}
void NewtonIterationMethod2(double x,double d){double a = x;double b = f2(a);int k=0; //记录循环的次数while(((a-b)>d) || ((a-b)<-1*d)){//cout<< a <<endl;a = b;b = f2(a);k ++;if(k>100){cout<<"迭代失败!(函数不收敛)"<<endl;return ;}}cout<< b <<endl;return;
}
void NewtonIterationMethod3(double x,double d){double a = x;double b = f3(a);int k=0; //记录循环的次数while(((a-b)>d) || ((a-b)<-1*d)){//cout<< a <<endl;a = b;b = f3(a);k ++;if(k>100){cout<<"迭代失败!(函数不收敛)"<<endl;return ;}}cout<< b <<endl;return;
}
//二分法
double check1(double x){double a = pow(e,x);return x*x-a;
}
double check2(double x){double a = pow(e,x);return a*x - 1;
}
double check3(double x){return log10(x) + x - 2;
}
void BinarySearch1(double d){double st = -1000,ed = 1000;double mid = 0.0f;while(ed - st > d){mid = st + (ed - st)/2;if(check1(mid) > 0){st = mid;}else if(check1(mid) < 0){ed = mid;}}cout<< mid <<endl;
}
void BinarySearch2(double d){double st = -1000,ed = 1000;double mid = 0.0f;while(ed - st > d){mid = st + (ed - st)/2;if(check2(mid) < 0){st = mid;}else if(check2(mid) > 0){ed = mid;}}cout<< mid <<endl;
}
void BinarySearch3(double d){double st = -1000,ed = 1000;double mid = 0.0f;while(ed - st > d){mid = st + (ed - st)/2;if(check3(mid) < 0){st = mid;}else if(check3(mid) > 0){ed = mid;}}cout<< mid <<endl;
}
int main(){cout<< "请输入初始值x0:";double x,d = eps;cin>> x ;cout<< "牛顿迭代法" <<endl;NewtonIterationMethod1(x,d);NewtonIterationMethod2(x,d);NewtonIterationMethod3(x,d);cout<< "二分法" <<endl;BinarySearch1(d);BinarySearch2(d);BinarySearch3(d);return 0;
}
#include<stdio.h>
#include<math.h>
#define eta 1e-6
//割线法
float ge(float(*f)(float),float x1,float x0)
{float x2,d;int k=0;do{k++;x2=x1-((*f)(x1)*(x1-x0))/((*f)(x1)-(*f)(x0));d=x1-x0;x0=x1;x1=x2;printf("x(%d)=%f\n",k,x0);}while(fabs(d)>eps&&fabs((*f)(x1))>eta);return x1;
}float f(float x)   //第一问
{return x*x-exp(x);
}
float f1(float x)  //第二问
{return x*exp(x)-1;
}
float f2(float x)  //第三问
{return log10(x)+x-2;
}int main()
{float x1,x0,y0,y1,y2;printf("please insert x1,x0\n");scanf("%f,%f",&x1,&x0);printf("x(0)=%f\n",x0);y0=ge(f,x1,x0);y1=ge(f1,x1,x0);y2=ge(f2,x1,x0);printf("one answer is %6f\n",y0);printf("two answer is %6f\n",y1);printf("three answer is %6f\n",y2);return 0;
}

实验结果:
这里写图片描述

这里写图片描述

这篇关于【计算方法】实验一 非线性方程求根数值解法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/377354

相关文章

poj 3974 and hdu 3068 最长回文串的O(n)解法(Manacher算法)

求一段字符串中的最长回文串。 因为数据量比较大,用原来的O(n^2)会爆。 小白上的O(n^2)解法代码:TLE啦~ #include<stdio.h>#include<string.h>const int Maxn = 1000000;char s[Maxn];int main(){char e[] = {"END"};while(scanf("%s", s) != EO

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言

数学建模笔记—— 非线性规划

数学建模笔记—— 非线性规划 非线性规划1. 模型原理1.1 非线性规划的标准型1.2 非线性规划求解的Matlab函数 2. 典型例题3. matlab代码求解3.1 例1 一个简单示例3.2 例2 选址问题1. 第一问 线性规划2. 第二问 非线性规划 非线性规划 非线性规划是一种求解目标函数或约束条件中有一个或几个非线性函数的最优化问题的方法。运筹学的一个重要分支。2

STM32(十一):ADC数模转换器实验

AD单通道: 1.RCC开启GPIO和ADC时钟。配置ADCCLK分频器。 2.配置GPIO,把GPIO配置成模拟输入的模式。 3.配置多路开关,把左面通道接入到右面规则组列表里。 4.配置ADC转换器, 包括AD转换器和AD数据寄存器。单次转换,连续转换;扫描、非扫描;有几个通道,触发源是什么,数据对齐是左对齐还是右对齐。 5.ADC_CMD 开启ADC。 void RCC_AD

HNU-2023电路与电子学-实验3

写在前面: 一、实验目的 1.了解简易模型机的内部结构和工作原理。 2.分析模型机的功能,设计 8 重 3-1 多路复用器。 3.分析模型机的功能,设计 8 重 2-1 多路复用器。 4.分析模型机的工作原理,设计模型机控制信号产生逻辑。 二、实验内容 1.用 VERILOG 语言设计模型机的 8 重 3-1 多路复用器; 2.用 VERILOG 语言设计模型机的 8 重 2-1 多

IBS和IBD的区别和计算方法介绍

大家好,我是邓飞。 今天介绍一下IBS和IBD的区别: IBS(肠易激综合症)和IBD(炎症性肠病)是两种不同的消化系统疾病,主要区别如下: IBS(Irritable Bowel Syndrome):是一种功能性肠道疾病,主要表现为腹痛、腹胀、腹泻或便秘,症状通常与饮食、压力和心理因素相关,没有明显的器质性病变。 IBD(Inflammatory Bowel Disease):是一组

组合c(m,n)的计算方法

问题:求解组合数C(n,m),即从n个相同物品中取出m个的方案数,由于结果可能非常大,对结果模10007即可。       共四种方案。ps:注意使用限制。 方案1: 暴力求解,C(n,m)=n*(n-1)*...*(n-m+1)/m!,n<=15 ; int Combination(int n, int m) { const int M = 10007; int

61.以太网数据回环实验(4)以太网数据收发器发送模块

(1)状态转移图: (2)IP数据包格式: (3)UDP数据包格式: (4)以太网发送模块代码: module udp_tx(input wire gmii_txc ,input wire reset_n ,input wire tx_start_en , //以太网开始发送信

LTspice模拟CCM和DCM模式的BUCK电路实验及参数计算

关于BUCK电路的原理可以参考硬件工程师炼成之路写的《 手撕Buck!Buck公式推导过程》.实验内容是将12V~5V的Buck电路仿真,要求纹波电压小于15mv. CCM和DCM的区别: CCM:在一个开关周期内,电感电流从不会到0. DCM:在开关周期内,电感电流总会到0. CCM模式Buck电路仿真: 在用LTspice模拟CCM电路时,MOS管驱动信号频率为100Khz,负载为10R(可自

交换两个变量数值的3种方法

前言:交换两个数值可不是"a = b,b = a"。这样做的话,a先等于了b的值;当“b = a”后,因为此时a已经等于b的值了,这个语句就相当于执行了b = b。最终的数值关系就成了a == b,b == b。 下面教给大家3种交换变量数值的方法: 目录 1. 中介法 2. 消和法 3. 异或法 4. 总结 1. 中介法 中介法(又称 临时变量法 或 酱油法),其中心