【计算方法】非线性方程求根实验

发布于:2022-07-24 ⋅ 阅读:(354) ⋅ 点赞:(0)

非线性方程求根实验

一、实验环境
实验设备:计算机
实验使用的语言:高级程序设计语言(C、Java 或 Matlab 等)
二、实验要求
1、认真分析题目的条件和要求,复习相关理论知识,选择适当的解决方案和算法;
2、编写上机实验程序,作好上机前的准备工作;
3、上机调试程序,并试算各种方案,记录计算的结果(包括必要的中间结果);
4、对实验结果进行分析、归纳、总结。
三、实验目的
1、掌握计算机上常用的一些求非线性方程的近似根的数值方法(二分法、迭代法、牛顿法、割线法),并能比较各种方法的异同点;
2、掌握迭代的收敛性定理,局部收敛性、收敛阶的概念。
3、正确应用所学方法求出给定的非线性方程满足一定精度要求的数值解。
四、实验内容
【实验题1】
实验题目1:用迭代法求方程的根。在这里插入图片描述

1.问题的求解算法及数据结构(流程图)
在这里插入图片描述

2.源程序清单

//迭代法 
#include<iostream>
#include<cmath>
using namespace std;

double use(double x)//求立方根 
{
    double x1,x2,w;
    x1=x;
    x2=(2.0*x1+x/(x1*x1))/3.0;
    w=(x2-x1)/x1;
    if(w<0)
    w=w*-1;
    while(w>=1e-6)
    {
        x1=x2;
        x2=(2*x1+x/(x1*x1))/3.0;
        w=(x2-x1)/x1;
        if(w<0)
            w=w*-1;
    }
    return x2;
}

int main()
{
    float x0,x1=0.0;
    int i=10;
    while(i--)
    {
    	
    	x1=use((x1+1)/2);
        cout<<x1<<endl;
        if(fabs(x1)<1e-6)break;
        
    }
    cout<<"方程的根为:"<<x1<<endl;
    return 0;
}

3.程序运行结果及分析
在这里插入图片描述

【实验题2】
用牛顿法求此方程在 x=1.5 附近的根。
在这里插入图片描述
1.问题的求解算法及数据结构(流程图)
在这里插入图片描述
2.源程序清单

//牛顿法 
#include<iostream>
#include<cmath> 
using namespace std;

double fx(double x)
{
    double y;
    y=x*x*x-x-1;
    return y;
}
double Fx(double x)
{
    double y1;
    y1=3*x*x-1;
    return y1;
	 
}
int main(){
    double x,x1,x2;

    x1=1.5;//求1.5附近的根
    
    x2=x1-fx(x1)/Fx(x1);
    int i=10;
    while(i--)
    {
        x1=x2;
        x2=x1-fx(x1)/Fx(x1);
        printf("答案为:%.8lf\n",x2);
    }
    printf("答案为:%lf\n",x2);
}

3.程序运行结果及分析
在这里插入图片描述
【实验题3】
求方程的全部实根。
在这里插入图片描述
在这里插入图片描述
方案 1. 用牛顿法求解;
方案 2. 用简单迭代法;
方案 3. 用割线法;
取相同迭代法初值,比较各方法的收敛速度

1.问题的求解算法及数据结构(要求画流程图)
在这里插入图片描述
2.源程序清单

//割线法 
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define eps 1e-6
#define MAX 50
#define f(x) (x*x*x-sin(x)-12*x+1)

int main() 
{
	int i=2;
	double x0,x1,x,q0,q1;
	x0=0;
	x1=1;
	q0=f(x0);
	q1=f(x1);
	printf("i xi f(x)\n");
	printf("%-2d %10.6lf %10.6lf\n",0,x0,q0);
	printf("%-2d %10.6lf %10.6lf\n",1,x1,q1);
	while(i<=MAX)
	{
		x=x1-q1*(x1-x0)/(q1-q0);
		printf("%-2d %10.6lf %10.6lf\n",i,x,f(x));
		if(fabs(x1-x0)<eps)
		{
			printf("The root =%10.6lf    f(%10.6lf)=%10.6lf\n",x,x,f(x));
			exit(0);
		}
		else
		{
			i++;
			x0=x1;
			q0=q1;
			x1=x;
			q1=f(x);
		}
			}
	if(i>MAX)
	{
		printf("secant method failed!!!\n");
	}
	
	return 0;
}

3.程序运行结果及分析
在这里插入图片描述

五、实验总结
这是计算方法课程的第一次线上上机实验,实验中迭代法、牛顿法、割线法三种算法均采用了while循环及if-else判断语句,编程函数并由主函数调用,较简单地实现了实验的编程任务。由本次实验结果来看,同等精度条件下,牛顿迭代法收敛快,稳定好,计算次数少,是求解非线性方程根的有效方法。此次实验较好的完成了任务,巩固了课堂知识。
通过本次实验我掌握了常用的一些求非线性方程的近似根的数值方法,如二分法、迭代法、牛顿法、割线法,并能比较各种方法的异同点;大致掌握了迭代的收敛性定理,局部收敛性、收敛阶的概念;能够正确应用所学方法求出给定的非线性方程满足一定精度要求的数值解。


网站公告

今日签到

点亮在社区的每一天
去签到