数值分析算法 MATLAB 实践 非线性方程(组)求解

本文涉及的产品
函数计算FC,每月15万CU 3个月
简介: 数值分析算法 MATLAB 实践 非线性方程(组)求解

数值分析算法 MATLAB 实践 非线性方程(组)求解

4.1 二分法

在这里插入图片描述

function [c,err,yc]=bisectmethod(fun,a,b,delta)
% 二分法function [c,err,yc]= bisectmethod (fun,a,b,delta)
%a为左区间,b为右区间,delta为区间误差限 
%c求解的值,err误差,yc:c在f(x)处的值
    ya=feval('fun',a);
    yb=feval('fun',b);
    if yb==0
        c=b;
        return;
    end
    if(ya*yb)>0
        disp('(a,b)不是有根区间');
        return;
    end
    max1=1+round((log(b-a)-log(delta))/log(2));
    for k=1:max1
        c=(a+b)/2;
        yc=feval('fun',c);
        if yc==0
            a=c;
            b=c;
            return;
        elseif(yb*yc)>0
                b=c;
                yb=yc;
        else
                a=c;
                ya=yc;
        end
        if(b-a)<delta
            break;
        end
    end
    c=(a+b)/2;
    err=abs(b-a);
    yc=feval('fun',c);
end
% 二分法function [c,err,yc]=bisectmethod(fun,a,b,delta)
%a为左区间,b为右区间,delta为区间误差限 
%c求解的值,err误差,yc:c在f(x)处的值
eps = 1e-4;
[x0,err,y_x0]=bisectmethod(@fun,-2,-1,eps);
disp(['方程组的解:x0= ']);
disp(x0)
function [xc,k_cnt] = bisect(f,a,b,tol)
% 二分法function [xc,k_cnt] = bisect(f,a,b,tol)
%a为左区间,b为右区间,tol为区间误差限 
%xc求解的值
    if sign(f(a))*sign(f(b))>=0
        error('f(a)f(b)<0 not satisfied!') % 停止运行
    end
    fa = f(a);
    fb = f(b);
    k_cnt=0;
    while (b-a)/2 > tol
        c = (a+b)/2;
        fc = f(c);
        if fc == 0
            break
        end
  if sign(fc)*sign(fa) < 0 
% [a,c]是新的区间
           b = c;
          fb = fc;
        else     % [b,c]是新的区间
            a = c;
            fa = fc;
        end
        k_cnt=k_cnt+1;
    end
xc = (a+b)/2; 
 % 新的中点就是最优估计
end
% 二分法function [xc,k_cnt] = bisect(f,a,b,tol)
%a为左区间,b为右区间,tol为区间误差限 
%xc求解的值
[x1,k1_cnt] = bisect(@fun,-2,-1,eps);
disp(['迭代次数:k1_cnt= ']);
disp(k1_cnt)
disp(['方程组的解:x1= ']);
disp(x1)

function y=fun(x)
    y=x.^3-3*x-1;
end

4.2 牛顿迭代法

在这里插入图片描述

function[p1,err,k,y]=NewtonFunmethod(fun,dfun,p0,delta,max1)
%fun是给定的非线性函数  %p0为初始值  %delta为给定误差界
%max1迭代次数的上限  %p1为所求得的方程的近似解  %err为p1-p0的绝对值
%k为所需要的迭代次数  %y=fun(p1)
for k=1:max1
p1 = p0-fun(p0)/dfun(p0);
%一定要有fun,dfun .m文件
%p1=p0feval('fun',p0)/feval('dfun',p0);
 err=abs(p1-p0);
  p0=p1;
  %y=feval('fun',p1);
    y= fun(p1);
   if(err<delta)|(y==0)
       break;
     end
end
end
%function [p1,err,k,y]=NewtonFunmethod(fun,dfun,p0,delta,max1)
%NewtonFunmethod对于初值比较敏感,选择不好,出现不收敛情况
delta = 1e-7;
p0 = 1.2;
it_max = 100;
[x2,err,k2_cnt,y]=NewtonFunmethod(@fun1,@dfun1,p0,delta,it_max);
disp(['迭代次数:k2_cnt= ']);
disp(k2_cnt)
disp(['方程组的解:x2= ']);
disp(x2)

function y=fun1(x)
    y=x.^3-3*x+2;
end
function y=dfun1(x)
    y=3*x.^2-3;
end

4.3 割线法

在这里插入图片描述

function[p1,err,k,y]=secantFunmethod(fun,p0,p1,delta,max1)
%割线法fun是给定的非线性函数  %p0,p1为初始值  %delta为给定误差界
%max1迭代次数的上限  %p1为所求得的方程的近似解  %err为p1-p0的绝对值
%k为所需要的迭代次数  %y=fun(p1)
for  k=1:max1
    p2 = p1-fun(p1)*(p1-p0)/(fun(p1)-fun(p0));
    err=abs(p2-p1);
    p0=p1;
    p1=p2;
    y = fun(p1);
    if(err<delta)||(abs(y)<0.00001)
          break;
    end
end
delta = 1e-6;
p0 = 1.0;
p1 = 1.5;
it_max = 100;
[x3,err,k3_cnt,y]=secantFunmethod(@fun2,p0,p1,delta,it_max);
disp(['迭代次数:k3_cnt= ']);
disp(k3_cnt)
disp(['方程组的解:x3= ']);
disp(x3)

function y=fun2(x)
    y=x.^3+4*x.^2-10;
end

4.4 非线性方程组-牛顿法

%牛顿迭代法 计算非线性方程组
%输入 x0 为迭代初值
%tol 为误差容限 如果缺省 默认为 10 的-10 次方
%data 用来存放计算的中间数据便于计算收敛情况分析
function [x,n,data]=new_ton(x0,tol)
    if nargin==1
         tol=1e-10;
    end
    x1=x0-f1(x0)/df1(x0);
    n=1;
    %迭代过程
    while (norm(x1-x0)>tol)
        x0=x1;
        x1=x0-f1(x0)/df1(x0);
        n=n+1;
        %data 用来存放中间数据
        data(:,n)=x1;
    end
    x=x1;
end
%牛顿迭代法的 方程函数
function f=f1(x0)
x=x0(1);
y=x0(2);
f1=x^2-2*x-y+0.5;
f2=x^2+4*y^2-4;
%最后方程函数 以行向量输出
f=[f1 f2];
end
% 求解非线性方程表达式的雅可比矩阵
function f=df1(x0)
    x=x0(1);
    y=x0(2);
    f=[2*x-2 -1
2*x 8*y];
end
x1=[1 1];
[x_1,k1_cnt,data]=new_ton(x1);
disp(['迭代次数:k1_cnt= ']);
disp(k1_cnt)
disp(['方程组的解:x_1= ']);
disp(x_1)
%抽取 data1 中第一个变量数据 画出曲线
subplot(2,1,1)
plot(data(1,:)),title('x 在迭代中的变化')
%抽取 data 中的第二个变量数据 画出其变化曲线
subplot(2,1,2)
plot(data(2,:)),title('y 在迭代中的变化')

在这里插入图片描述

function [allx,ally,r,n]=MultiNewton(F,x0,eps)
% allx是用来记录每一步迭代的点的矩阵,ally是用来记录迭代点对应计算出来的函数值的,
% r是满足精度要求的最终迭代点 n迭代次数
  if nargin==2
    eps=1.0e-4;
  end
  x0 = transpose(x0);
  Fx = subs(F,transpose(symvar(F)),x0);
  var = transpose(symvar(F));
  dF = jacobian(F,var);
  dFx = subs(dF,transpose(symvar(F)),x0);
  n=dFx;
  r=x0-inv(dFx)*Fx';
  n=1;
  tol=1;
  N=100;
  symx=length(x0);
  ally=zeros(symx,N);
  allx=zeros(symx,N);
  while tol>eps
    x0=r;
    Fx = subs(F,transpose(symvar(F)),x0);
    dFx = subs(dF,transpose(symvar(F)),x0);
    r=vpa(x0-inv(dFx)*Fx');
    tol=norm(r-x0)
    if(n>N)
disp('迭代步数太多,可能不收敛!');break;
    end
    allx(:,n)=x0;
    ally(:,n)=Fx;
    n=n+1;
end
function f = Multifun(x)


% 只需要将fun.m文件中的 k更改为所需维数,文件中的方程替换为你自己所需的方程
% x(1)->x x(2)->y x(3)->z
%{
    f(1)=3*x(1)-cos(x(1)*x(2))-1/2;
    f(2)=x(1)^2-81*(x(2)+0.1)^2+sin(x(3))+1.06;
    f(3)= exp(-1*x(1)*x(2))+20*x(3)+(10*pi-3)/3;
%}
     k=3;
    for i=1:k
      x(i)=sym (['x',num2str(i)]);
    end 

  f(1)=3*x(1)-cos(x(1)*x(2))-1/2;
  f(2)=x(1)^2-81*(x(2)+0.1)^2+sin(x(3))+1.06;
  f(3)= exp(-1*x(1)*x(2))+20*x(3)+(10*pi-3)/3;
end
allx0 = [1,1,1];
[allx,ally,r,k_cnt]=MultiNewton(Multifun,allx0);
disp(['迭代次数:k_cnt= ']);
disp(k_cnt)
disp(['方程组的解:allx= ']);
disp(allx)
相关实践学习
【文生图】一键部署Stable Diffusion基于函数计算
本实验教你如何在函数计算FC上从零开始部署Stable Diffusion来进行AI绘画创作,开启AIGC盲盒。函数计算提供一定的免费额度供用户使用。本实验答疑钉钉群:29290019867
建立 Serverless 思维
本课程包括: Serverless 应用引擎的概念, 为开发者带来的实际价值, 以及让您了解常见的 Serverless 架构模式
目录
相关文章
|
3天前
|
算法 数据安全/隐私保护
室内障碍物射线追踪算法matlab模拟仿真
### 简介 本项目展示了室内障碍物射线追踪算法在无线通信中的应用。通过Matlab 2022a实现,包含完整程序运行效果(无水印),支持增加发射点和室内墙壁设置。核心代码配有详细中文注释及操作视频。该算法基于几何光学原理,模拟信号在复杂室内环境中的传播路径与强度,涵盖场景建模、射线发射、传播及接收点场强计算等步骤,为无线网络规划提供重要依据。
|
4天前
|
机器学习/深度学习 数据采集 算法
基于GA遗传优化的CNN-GRU-SAM网络时间序列回归预测算法matlab仿真
本项目基于MATLAB2022a实现时间序列预测,采用CNN-GRU-SAM网络结构。卷积层提取局部特征,GRU层处理长期依赖,自注意力机制捕捉全局特征。完整代码含中文注释和操作视频,运行效果无水印展示。算法通过数据归一化、种群初始化、适应度计算、个体更新等步骤优化网络参数,最终输出预测结果。适用于金融市场、气象预报等领域。
基于GA遗传优化的CNN-GRU-SAM网络时间序列回归预测算法matlab仿真
|
4天前
|
算法
基于龙格库塔算法的锅炉单相受热管建模与matlab数值仿真
本设计基于龙格库塔算法对锅炉单相受热管进行建模与MATLAB数值仿真,简化为喷水减温器和末级过热器组合,考虑均匀传热及静态烟气处理。使用MATLAB2022A版本运行,展示自编与内置四阶龙格库塔法的精度对比及误差分析。模型涉及热传递和流体动力学原理,适用于优化锅炉效率。
|
2天前
|
移动开发 算法 计算机视觉
基于分块贝叶斯非局部均值优化(OBNLM)的图像去噪算法matlab仿真
本项目基于分块贝叶斯非局部均值优化(OBNLM)算法实现图像去噪,使用MATLAB2022A进行仿真。通过调整块大小和窗口大小等参数,研究其对去噪效果的影响。OBNLM结合了经典NLM算法与贝叶斯统计理论,利用块匹配和概率模型优化相似块的加权融合,提高去噪效率和保真度。实验展示了不同参数设置下的去噪结果,验证了算法的有效性。
|
9天前
|
机器学习/深度学习 算法
基于遗传优化的双BP神经网络金融序列预测算法matlab仿真
本项目基于遗传优化的双BP神经网络实现金融序列预测,使用MATLAB2022A进行仿真。算法通过两个初始学习率不同的BP神经网络(e1, e2)协同工作,结合遗传算法优化,提高预测精度。实验展示了三个算法的误差对比结果,验证了该方法的有效性。
|
8天前
|
算法
基于梯度流的扩散映射卡尔曼滤波算法的信号预处理matlab仿真
本项目基于梯度流的扩散映射卡尔曼滤波算法(GFDMKF),用于信号预处理的MATLAB仿真。通过设置不同噪声大小,测试滤波效果。核心代码实现数据加载、含噪信号生成、扩散映射构建及DMK滤波器应用,并展示含噪与无噪信号及滤波结果的对比图。GFDMKF结合非线性流形学习与经典卡尔曼滤波,提高对非线性高维信号的滤波和跟踪性能。 **主要步骤:** 1. 加载数据并生成含噪测量值。 2. 使用扩散映射捕捉低维流形结构。 3. 应用DMK滤波器进行状态估计。 4. 绘制不同SNR下的轨迹示例。
|
6天前
|
算法 5G
基于MSWA相继加权平均的交通流量分配算法matlab仿真
本项目基于MSWA(Modified Successive Weighted Averaging)相继加权平均算法,对包含6个节点、11个路段和9个OD对的交通网络进行流量分配仿真。通过MATLAB2022A实现,核心代码展示了迭代过程及路径收敛曲线。MSWA算法在经典的SUE模型基础上改进,引入动态权重策略,提高分配结果的稳定性和收敛效率。该项目旨在预测和分析城市路网中的交通流量分布,达到用户均衡状态,确保没有出行者能通过改变路径减少个人旅行成本。仿真结果显示了27条无折返有效路径的流量分配情况。
|
23小时前
|
算法 决策智能
基于SA模拟退火优化算法的TSP问题求解matlab仿真,并对比ACO蚁群优化算法
本项目基于MATLAB2022A,使用模拟退火(SA)和蚁群优化(ACO)算法求解旅行商问题(TSP),对比两者的仿真时间、收敛曲线及最短路径长度。SA源于金属退火过程,允许暂时接受较差解以跳出局部最优;ACO模仿蚂蚁信息素机制,通过正反馈发现最优路径。结果显示SA全局探索能力强,ACO在路径优化类问题中表现优异。
|
6天前
|
传感器 算法
基于GA遗传优化的WSN网络最优节点部署算法matlab仿真
本项目基于遗传算法(GA)优化无线传感器网络(WSN)的节点部署,旨在通过最少的节点数量实现最大覆盖。使用MATLAB2022A进行仿真,展示了不同初始节点数量(15、25、40)下的优化结果。核心程序实现了最佳解获取、节点部署绘制及适应度变化曲线展示。遗传算法通过初始化、选择、交叉和变异步骤,逐步优化节点位置配置,最终达到最优覆盖率。
|
6天前
|
算法
基于RRT优化算法的机械臂路径规划和避障matlab仿真
本课题基于RRT优化算法实现机械臂路径规划与避障。通过MATLAB2022a进行仿真,先利用RRT算法计算避障路径,再将路径平滑处理,并转换为机械臂的关节角度序列,确保机械臂在复杂环境中无碰撞移动。系统原理包括随机生成树结构探索空间、直线扩展与障碍物检测等步骤,最终实现高效路径规划。
下一篇
开通oss服务