MATLAB求解非线性方程组的五种方法

求解线性方程分为两种方法–二分法和迭代法
常见的方法一共有5种
二分法
迭代法
牛顿法
割线法
拟牛顿法
Halley法

使用条件
二分法需要知道两个自变量,分别是一个根的两侧

牛顿法迭代法是最常用的方法,收敛性信赖于初值,取不同的初值可以的方程不同的根,函数用的是一阶导数,输入的是一个猜想的可能的值

割线法给定两个初值再带入计算,比如要在2附近求一个根,那就可以假设这个范围是(1.9,2)
拟牛顿法这个比较方便,用时最好可以找到一个好的初始值
Halley法需要知道函数值以及它的一阶求导、二阶求导

这里我就从计算代码的角度来讲解,在下面也会按照上面这个顺序给出代码,遇到方程组直接带入已知条件就可以得到答案。

二分法

基本函数是这样子的:y = dichotomy(fun,a,b,tol);二分法的算法要输入四个变量,fun,a,b,tol:函数,一个根的左右点,tol=1.0e-6

function y = fun(x)
y = x^3 - 5 * x + 4.272;

上面这个就是定义的fun,每次的输入的方程不同,第一条不动,直接改第二行就可以的。比如这里我们要计算的方程y = x^3 - 5 * x + 4.272;
我们是可以通过简单计算得到一个根的两侧分别是1和1.3

那在窗口指令指令中输入x=dichotomy(’fun‘,1,1.3,1.0e-6)就可以得到结果

function y = dichotomy(fun,a,b,tol)
if nargin < 4tol = 1.0e-5;
end
n = 1;
if feval(fun,a)*feval(fun,b)<0c = (a+b)/2;while (abs(b-c)>tol) && (abs(feval(fun,c))>tol)if (feval(fun,c)*feval(fun,a)>0)a = c;c = (a+b)/2;elseif (feval(fun,c)*feval(fun,a)<0)b = c;c = (a+b)/2;elsey = c;tol = 100;endn = n + 1;endy = c;
elseif feval(fun,a)==0y = a;
elseif feval(fun,b)==0y = b;
elsedisp('there may not be a root in the interval');
end
n
function y = fun(x)
y = x^3 - 5 * x + 4.272;

牛顿法
还是用刚才那道题,y = x^3 - 5 * x + 4.272,一阶导是y = 3 * x^2 - 5;

function y = dfun(x)
y = 3 * x^2 - 5;

下面的是具体的算法,根据x = newton(x0,tol),我们只需要输入一个我们猜想的值就可以。但是有一定的误差

function x = newton(x0,tol)
if nargin < 2tol = 1.0e-5;
end
x = x0 - fun(x0)/dfun(x0);
n = 1;
while (norm(x-x0)>tol) && (n<1000)x0 = x;x = x0 - fun(x0)/dfun(x0);n = n + 1;
end
n

割线法

这里我们用割线法求y = x^3 - 5 * x + 4.272在方程x=2的根,输入上要用两个初始值,比如说现在来计算就可以输入x=secant(2,1.9,10e-6)

function x = secant(x0,x1,tol)
if nargin < 3tol = 1.0e-5;
end
x = x0 - fun(x0) * (x0 - x1) / (fun(x0) - fun(x1));
n = 1;
while (abs(x0-x1) > tol) && (n <= 1000)x1 = x0;x0 = x;x = x0 - fun(x0) * (x0 - x1) / (fun(x0) - fun(x1));n = n + 1;
end
n

拟牛顿法

这里我们可以直接找到一个初始值输入,比如说broyden2,10e-6),如果不知道不确定也没关系,至少要知道一个范围。比如说给个范围(0.5,0.5)有下面这个函数

function y = funm(x)
y(1,1) = x(1,1) - 0.7 * sin(x(1,1)) - 0.2 * cos(x(2,1));
y(2,1) = x(2,1) - 0.7 * cos(x(1,1)) + 0.2 * sin(x(2,1));

那就可以输入x = broyden(x0,tol)

function x = broyden([0.5,0.5],tol)
if nargin < 2tol = 1.0e-5;
end
A = eye(size(x0,1));
x = x0 - A \ funm(x0);
n = 1;
while (norm(x - x0) > tol) && (n < 1000)x0 = x;x = x0 - A \ funm(x0);p = x - x0;q = funm(x) - funm(x0);A = A + (q - A*p)*p'/norm(p)^2;n = n + 1;
end
n

Halley法

这个要求二阶导,比如说第一个道题,y = x^3 - 5 * x + 4.272;,二阶导数是下面这个输入

function y = d2fun(x)
y = 6 * x;

最后输入x = halley(1,10e-6)就可以计算出一个结果

function x = halley(x0,tol)
if nargin < 2tol = 1.0e-5;
end
m = size(x0,1);
x = x0 - (eye(m) - 1/2 * (dfun(x0) \ d2fun(x0)) * (dfun(x0) \ fun(x0))) \ ...(dfun(x0) \ fun(x0));
n = 1;
while (norm(x - x0) > tol) && (n < 1000)x0 = x;x = x0 - (eye(m) - 1/2 * (dfun(x0) \ d2fun(x0)) * (dfun(x0) \ fun(x0))) \ ...(dfun(x0) \ fun(x0));n = n + 1;
end
n

MATLAB求解非线性方程组的五种方法相关推荐

  1. MATLAB求解非线性方程组(牛顿拉夫逊方法)

    文章目录 MATLAB求解非线性方程组(牛顿拉夫逊方法) Equation.m 函数 牛顿拉夫逊方法迭代求解 MATLAB求解非线性方程组(牛顿拉夫逊方法) Equation.m 函数 这个函数用来写 ...

  2. 非线性方程的粒子群算法matlab,求解非线性方程组的量子行为粒子群算法

    好文网为大家准备了关于求解非线性方程组的量子行为粒子群算法的文章,好文网里面收集了五十多篇关于好求解非线性方程组的量子行为粒子群算法好文,希望可以帮助大家.更多关于求解非线性方程组的量子行为粒子群算法 ...

  3. matlab矩阵方程奇异,matlab求解非线性方程组 牛顿迭代发 奇异矩阵

    求高手帮忙看看下面的程序怎么改  牛顿迭代法  求解后现实矩阵奇异,跪求高手 -------------------------------- %首先建立函数fun %储存方程组编程如下将fun.m ...

  4. 用matlab求解不等方程组,Matlab:求高人指点用matlab求解非线性方程组,解出来的值不收敛,提前结束...

    fsolve解非线性方程组,只迭代了8次就退出了,得到的结果进行复算不等于0,存在较大的误差.(是不是需要修改算法?) 运行程序得到的结果提示如下: x = 1.0e+003 * Columns 1 ...

  5. matlab 方程组 无解,用matlab求解非线性方程组说无解,一定是方程组本身无解,还是有可能程序有问题呢? - 计算模拟 - 小木虫 - 学术 科研 互动社区...

    应该是方程本身的问题,对于一些方程本身是无法获得解析解的. 下面第一部分是MATLAB的程序结果,图片部分是Maple计算的,看来没有解析解. syms B S a b c d e f g h [B, ...

  6. 用matlab解非线性方程组,用matlab求解非线性方程组,

    共回答了17个问题采纳率:76.5% matlab源程序为: S=solve('x1-(7+x2^2+4*x3)/12=0','x2-(11-x1^2+x3)/10=0','x3-(8-x2^3)/1 ...

  7. MATLAB求解非线性方程组

    function F = fun(x)x1 = x(1); x2 = x(2);F = [2*x1+3*x2-3;3*x1+2*x2-5];>>fsolve(@fun,[0,0])如果有变 ...

  8. broyden matlab,Broyden方法求解非线性方程组的Matlab实现

    <Broyden方法求解非线性方程组的Matlab实现>由会员分享,可在线阅读,更多相关<Broyden方法求解非线性方程组的Matlab实现(7页珍藏版)>请在人人文库网上搜 ...

  9. python线性方程组求解_python求解方程组的三种方法

    python求解方程组的三种方法: Numpy求解方程组x + 2y = 3 4x + 5y = 6 当然我们可以手动写出解析解,然后写一个函数来求解,这实际上只是用 Python 来单纯做" ...

最新文章

  1. python2转python3文件
  2. kubernetes1.30集群部署+dashboard+heapster
  3. php通过正则表达式下载图片到本地的实现代码,PHP通过正则表达式下载图片到本地的实现代码...
  4. 在 Excel 里使用 ODBC 读取 SAP BTP 平台上 CDS view 的数据
  5. Linux--根文件系统的挂载过程分析
  6. 基于Flask实现后台权限管理系统 - 导言
  7. Activity-数据状态的保存
  8. 计算机系统操作技师考试题,机关事业单位技术工人计算机操作技师考试题库
  9. 剑指MBA?Acer发布全高清触控Win8平板Aspire S7
  10. 正则表达式同时匹配中英文及常用正则表达式
  11. web前端笔试试题一(含答案)
  12. Mysql UDF Bug “ERROR 1125 (HY000): Function ‘xxx‘ already exists“
  13. Spring启动异常之ConflictingBeanDefinitionException: Annotation-specified bean name ‘XXXXXService‘
  14. html文件超链接打不开,Excel中出现超链接打不开的解决方法
  15. Java教练和运动员,乒乓球和篮球出国打比赛,需要学英语
  16. python 实现单链表 Lined List
  17. 行业调研:Platform Ops
  18. Unity线性工作流下UI保持Gamma的解决方案收集
  19. (2018 -NIPS)SimplE embedding for link prediction in knowledge
  20. JSP邮编区号管理系统

热门文章

  1. OpenGL ES的状态机说法其实也没那么云山雾照,比较容易理解!
  2. Maven 私服的上传和下载
  3. Kubernetes学习之Deployment控制器
  4. 小米5主板原理图_小米5手机拆机图解教程
  5. kafka的副本以及分区与副本的关系
  6. centos7双机搭建_CentOS 7 配置 Keepalived 实现双机热备
  7. 数说故事香氛品类分析及行业新趋势、消费者需求洞察
  8. 软件版本发布要求和标准
  9. IEEE专访李开复:人类已打开潘多拉盒子,封堵AI变革只会徒劳
  10. Java经典好资源-[http://blog.csdn.net/miaogang]