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 < 4
    tol = 1.0e-5;
end
n = 1;
if feval(fun,a)*feval(fun,b)<0
    c = (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;
        else
            y = c;
            tol = 100;
        end
        n = n + 1;
    end
    y = c;
elseif feval(fun,a)==0
    y = a;
elseif feval(fun,b)==0
    y = b;
else
    disp('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 < 2
    tol = 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 < 3
    tol = 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.50.5],tol)
if nargin < 2
    tol = 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 < 2
    tol = 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
相关文章
|
7月前
|
算法 数据安全/隐私保护 计算机视觉
基于二维CS-SCHT变换和LABS方法的水印嵌入和提取算法matlab仿真
该内容包括一个算法的运行展示和详细步骤,使用了MATLAB2022a。算法涉及水印嵌入和提取,利用LAB色彩空间可能用于隐藏水印。水印通过二维CS-SCHT变换、低频系数处理和特定解码策略来提取。代码段展示了水印置乱、图像处理(如噪声、旋转、剪切等攻击)以及水印的逆置乱和提取过程。最后,计算并保存了比特率,用于评估水印的稳健性。
|
4月前
|
存储 算法 Serverless
【matlab】matlab基于DTW和HMM方法数字语音识别系统(源码+音频文件+GUI界面)【独一无二】
【matlab】matlab基于DTW和HMM方法数字语音识别系统(源码+音频文件+GUI界面)【独一无二】
|
4月前
|
计算机视觉
【图像处理】基于灰度矩的亚像素边缘检测方法理论及MATLAB实现
基于灰度矩的亚像素边缘检测方法,包括理论基础和MATLAB实现,通过计算图像的灰度矩来精确定位边缘位置,并提供了详细的MATLAB代码和实验结果图。
127 6
|
4月前
|
算法 数据安全/隐私保护
基于星座图整形方法的QAM调制解调系统MATLAB误码率仿真,对比16,32,64,256四种QAM调制方式
本MATLAB 2022a仿真展示了不同QAM阶数下的星座图及误码率性能,通过星座图整形技术优化了系统性能。该技术利用非均匀分布的星座点提高功率效率,并通过合理布局增强抗干扰能力。随着QAM阶数增加,数据传输速率提升,但对信道质量要求也更高。核心程序实现了从比特生成到QAM映射、功率归一化、加噪及解调的全过程,并评估了系统误码率。
91 0
|
5月前
|
算法 vr&ar
基于自适应波束成形算法的matlab性能仿真,对比SG和RLS两种方法
```markdown - MATLAB2022a中比较SG与RLS自适应波束成形算法。核心程序实现阵列信号处理,强化期望信号,抑制干扰。RLS以其高效计算权重,而SG则以简单和低计算复杂度著称。[12345] [6666666666] [777777] ```
|
7月前
|
算法 数据安全/隐私保护 C++
基于二维CS-SCHT变换和扩频方法的彩色图像水印嵌入和提取算法matlab仿真
该内容是关于一个图像水印算法的描述。在MATLAB2022a中运行,算法包括水印的嵌入和提取。首先,RGB图像转换为YUV格式,然后水印通过特定规则嵌入到Y分量中,并经过Arnold置乱增强安全性。水印提取时,经过逆过程恢复,使用了二维CS-SCHT变换和噪声对比度(NC)计算来评估水印的鲁棒性。代码中展示了从RGB到YUV的转换、水印嵌入、JPEG压缩攻击模拟以及水印提取的步骤。
|
5月前
|
算法 安全 数据挖掘
随机数生成方法及其在Matlab中的应用
随机数生成方法及其在Matlab中的应用
单向/双向V2G环境下分布式电源与电动汽车充电站联合配置方法(matlab代码)
单向/双向V2G环境下分布式电源与电动汽车充电站联合配置方法(matlab代码)
基于纳什谈判理论的风–光–氢多主体能源系统合作运行方法(含matlab代码)
基于纳什谈判理论的风–光–氢多主体能源系统合作运行方法(含matlab代码)
|
7月前
|
调度
考虑充电负荷空间可调度特性的分布式电源与电动汽车充电站联合配置方法(matlab代码)
考虑充电负荷空间可调度特性的分布式电源与电动汽车充电站联合配置方法(matlab代码)

热门文章

最新文章