数学:非线性方程的求解---(笔记+代码)
2017-05-17 00:22
246 查看
code:
/** *求解f(x) = x^4 - x - 2 *求解步骤 *1、对于给出的函数f(x),编写一个函数与之对应function() *2、使用给定的算法进行求解f(x) = 0 */ Double function(Double x){ return pow(x,4) - x - 2; } /** *sign(x)符号函数,小于0返回0,否则返回1 */ bool sign(Double x){ return x > 0; } Double dabs(Double x){ if(x < 0) x = -x; return x; } /** *二分法的代码实现 *参数是区间(a,b),而且 *f(a)f(b) < 0 *我们可以不指定a,b,使用试探法进行 *自动的a,b赋值,但是这种方法并不保险 */ Double binary_calcutateX(Double a,Double b){ if(function(a) * function(b) > 0) return 0;//不满足条件 if(function(a) == 0) return a; if(function(b) == 0) return b; Double x; while(dabs(b - a) > ERR){ x = a+(b-a)/2; if(sign(function(x)) == sign(function(a))){ a = x; } else{ b = x; } } return a + (b-a)/2; }
code:
/** *不动点迭代法 *参数x0 *需要用到f(x)的变形x = h(x) = x^4 - 2 *或者x = h(x) = (x+1)^(1/4) *注意这个变换形式很重要 */ Double h(Double x){ return pow(x,4) - 2; } Double h1(Double x){ return pow(x+2,1.0/4); } Double staticNode(Double x){//初始值不同时,会找到距离这个初始值最近的根 int k = 0;//记录迭代的次数 Double x1 = x; while(dabs(function(x)) > ERR1 || dabs(x1 - x) > ERR2){ x = x1; //x1 = h(x); x1 = h1(x); k += 1; } return x; }
应用和问题:
一般可以用来求一个数n的平方根a;
1、无法保证全局收敛性
2、要求f(x)在其根值附近有连续的2阶导数
3、每一次计算都要计算f’(x),计算量大,一般用在f’(x)确定的情况下
Code:
/** *牛顿迭代法 *参数:x0 *需要导函数ff */ //f(x) = x^4 - x - 2的导函数 Double ff(Double x){ return 4*pow(x,3) - 1; } Double niudun(Double x){ int k = 0;//记录迭代的次数 Double x1 = x; while(dabs(function(x)) > ERR1 || dabs(x1 - x) > ERR2){ x = x1; x1 = x - function(x)/ff(x); k += 1; } return x; }
Code:
/** *平行弦法 *参数:x0 *需要导函数ff */ Double parallel(Double x){ int k = 0;//记录迭代的次数 Double xx = ff(x); Double x1 = x; while(dabs(function(x)) > ERR1 || dabs(x1 - x) > ERR2){ x = x1; x1 = x - function(x)/xx; k += 1; } return x; }
Code:
/** *割线法 *参数:x0,x1 *!!!!!!这个代码对这个样例出现的死循环 */ Double gexian(Double x0,Double x1){ int k = 0;//记录迭代的次数 Double x2 = x1; while(dabs(function(x1)) > ERR1 || dabs(x1 - x0) > ERR2){ cout<<x0<<" "<<function(x0)<<endl; cout<<x1<<" "<<function(x1)<<endl; x2 = x1 - function(x1)/(function(x1) - function(x0));//注意除0错误 x0 = x1; x1 = x2; k += 1; } return x1; }
测试代码和头文件代码:
头文件head.h
#include<iostream> #include<stdio.h> #include<algorithm> #include<math.h> using namespace std; typedef long double Double; const Double ERR = 1e-4; const Double ERR1 = 1e-4; const Double ERR2 = 1e-4;
测试代码:
#include "head.h" int main() { Double x5 = 0,x4 = 0,x3 = 0,x2 = 0,x1 = 0,a = 1.0,b = 1.5; x1 = binary_calcutateX(a,b); x2 = staticNode(b); x3 = niudun(b); x4 = parallel(b); //x5 = gexian(a,b); cout<<"x1 = "<<x1<<endl; cout<<"f(x1) = "<<function(x1)<<endl; cout<<"x2 = "<<x2<<endl; cout<<"f(x2) = "<<function(x2)<<endl; cout<<"x3 = "<<x3<<endl; cout<<"f(x3) = "<<function(x3)<<endl; cout<<"x4 = "<<x4<<endl; cout<<"f(x4) = "<<function(x4)<<endl; //cout<<"x5 = "<<x5<<endl; //cout<<"f(x5) = "<<function(x5)<<endl; return 0; }
相关文章推荐
- 非线性方程求解
- 非线性方程的数值解法——二分法求解
- 数值分析读书笔记(4)求非线性方程的数值求解
- 第11讲 数学方程求解
- MatLab建模学习笔记8——非线性规划问题求解
- hdu_2348_三分求解最值方程_数学题_少用tan
- HDU 4033【数学几何余弦定理+二分求解方程】
- MatLab建模学习笔记10——利用罚函数求解非线性规划问题
- MatLab建模学习笔记8——非线性规划问题求解
- MatLab建模学习笔记10——利用罚函数求解非线性规划问题
- 数值计算——一维非线性方程求解
- 二分法 简单迭代法 Newton法 弦截法 求解非线性方程的根
- 机器学习笔记_数学基础_6-矩阵方程组的求解与最小二乘定义
- 遗传算法求解带非线性约束的单目标问题,matlab代码,基于K Deb的论文
- 数值计算方法:二分法求解方程的根(伪代码 python c/c++)
- 非线性方程求解:孙悟空与贾宝玉的前世今生
- 多变量非线性方程求解问题(牛顿迭代法)
- 试位法求解非线性方程的根
- MATLAB实例之对线性,非线性,超越方程的求解
- 数学建模常用Matlab/Lingo/c代码总结系列——非线性拟合