抛物线法、牛顿法、弦截法求根实例
时间:2022-07-26
本文章向大家介绍抛物线法、牛顿法、弦截法求根实例,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
计算方法第四次计算实习题
7.用下列方法求
(1)用牛顿法
(2)用弦截法,取
(3)用抛物线法,取
解题思路:按部就班,套公式编写程序即可注意控制精度,要求准确到四位有效数字,即要求准确解和所得近似解误差不超过
,同时要注意迭代时的变量关系,以下是源代码:
(1)牛顿法:
/**
* @Title: newton.java
* @Desc: TODO
* @Package: root
* @author: glm233
* @date: 2020年5月25日 下午10:53:16
* @version 1.0
*/
package root;
/**
* @ClassName: newton
* @Desc: TODO
* @author: glm233
* @date: 2020年5月25日 下午10:53:16
* @version 1.0
*/
import java.util.Scanner;
public class newton {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入起始点:");
double x = scanner.nextDouble();
System.out.print("请输入误差允许范围:");
double e = scanner.nextDouble();
System.out.print("请输入最大迭代次数:");
int N = scanner.nextInt();
scanner.close();
double res = getEistimate(x,e,N);
System.out.println("牛顿法得到的解为:" + res);
}
private static double getEistimate(double x,double e,int N) {
double result,x1;
for (int k = 1; true ; k++ ) {
if(f(x) == 0){
throw new RuntimeException("出现奇异情况....");
}
x1 = x - F(x)/f(x);
if(Math.abs(x1 - x) < e ){
System.out.println("迭代" + k + "次得到结果");
return x1;
}
if(k == N){
throw new RuntimeException("迭代失败,已达最大迭代次数N....");
}
x = x1;
}
}
private static double F(double x) {
return x*x*x -3*x-1;
}
private static double f(double x) {
return 3*x*x -3;
}
}
运行结果:
(2)用弦截法,取
/**
* @Title: secant.java
* @Desc: TODO
* @Package: root
* @author: glm233
* @date: 2020年5月25日 下午11:05:56
* @version 1.0
*/
package root;
import java.util.Scanner;
/**
* @ClassName: secant
* @Desc: TODO
* @author: glm233
* @date: 2020年5月25日 下午11:05:56
* @version 1.0
*/
public class secant {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入初值1:");
double x0 = scanner.nextDouble();
System.out.print("请输入初值2:");
double x1 = scanner.nextDouble();
System.out.print("请输入误差允许范围:");
double e = scanner.nextDouble();
System.out.print("请输入最大迭代次数:");
int N = scanner.nextInt();
scanner.close();
double res = getEistimate(x0,x1,e,N);
System.out.println("快速弦截法得到的解为:" + res);
}
private static double getEistimate(double x0,double x1,double e,int N) {
double x2;
for (int k = 0; true ; k++ ) {
if(f(x0,x1) == 0){
throw new RuntimeException("出现奇异情况....");
}
x2 = x1 - F(x1)/f(x0,x1);
if(Math.abs(x2 - x1) < e){
System.out.println("迭代" + k + "次得到结果");
return x2;
}
if(k == N){
throw new RuntimeException("迭代失败,已达最大迭代次数N....");
}
x0 = x1;
x1 = x2;
}
}
private static double f(double x0, double x1) {
return (F(x1) - F(x0))/(x1 - x0);
}
private static double F(double x) {
return x*x*x -3*x-1;
}
}
运行结果:
]
(3)用抛物线法,取
/**
* @Title: parabolic.java
* @Desc: TODO
* @Package: root
* @author: glm233
* @date: 2020年5月25日 下午11:10:01
* @version 1.0
*/
package root;
import java.util.Scanner;
/**
* @ClassName: parabolic
* @Desc: TODO
* @author: glm233
* @date: 2020年5月25日 下午11:10:01
* @version 1.0
*/
public class parabolic {
public final static double check=1.87938524;
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入初值1:");
double x0 = scanner.nextDouble();
System.out.print("请输入初值2:");
double x1 = scanner.nextDouble();
System.out.print("请输入初值3:");
double x2 = scanner.nextDouble();
System.out.print("请输入误差允许范围:");
double e = scanner.nextDouble();
System.out.print("请输入最大迭代次数:");
int N = scanner.nextInt();
scanner.close();
double res = getEistimate(x0,x1,x2,e,N);
System.out.println("精确解为:" + check);
System.out.println("抛物线法得到的解为:" + res);
}
private static double getEistimate(double x0,double x1,double x2,double e,int N) {
double x3,w=omiga(x0,x1,x2);
for (int k = 0; true ; k++ ) {
if(w*w<4*F(x2)*f(x0,x1,x2)){
throw new RuntimeException("出现奇异情况....");
}
if(w>0) {
x3 = x2 - 2*F(x2)/(w+Math.sqrt(w*w-4*F(x2)*f(x0,x1,x2)));
}
else x3 = x2 - 2*F(x2)/(w-Math.sqrt(w*w-4*F(x2)*f(x0,x1,x2)));
if(Math.abs(x3 - check) < e){
System.out.println("迭代" + k + "次得到结果");
//System.out.println(x3-check);
return x2;
}
if(k == N){
throw new RuntimeException("迭代失败,已达最大迭代次数N....");
}
//System.out.println(x3);
x0 = x1;
x1 = x2;
x2 = x3;
}
}
private static double omiga(double x0,double x1,double x2){
return f(x0,x1,x2)*(x2-x1)+f(x2,x1);
}
private static double f(double x0, double x1) {
return (F(x1) - F(x0))/(x1 - x0);
}
private static double f(double x0, double x1,double x2) {
return (f(x1,x2)-f(x1,x0))/(x2-x0);
}
private static double F(double x) {
return x*x*x -3*x-1;
}
}
运行结果:
- 关于数据库无法登录的问题反思(r6笔记第49天)
- SQL中distinct的用法
- 数据结构是哈希表(hashTable)(一)
- 关于奇怪的并行进程分析(三)(r6笔记第47天)
- 数据结构是哈希表(hashTable)(二)
- Oracle的Replace函数与translate函数详解与比较
- 关于奇怪的并行进程分析(二) (r6笔记第46天)
- Linux性能分析工具与图形化方法
- MySQL和Oracle中的隐式转换(r6笔记第45天)
- R语言的数据导入与导出(write.table,CAT)
- gqlplus的简单使用(r6笔记第43天)
- Java基础-21(01)总结字符流,IO流编码问题,实用案例必做一遍
- zabbix中配置dg的监控(r6笔记第62天)
- Apache ActiveMQ 远程代码执行漏洞 (CVE-2016-3088)分析
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法