zoukankan      html  css  js  c++  java
  • matlab-非线性方程求根函数及函数曲线绘制

    Matlab中提供了很多求解非线性方程(y=f(x))的函数,刚開始使用,真的很困惑。全部。这里依据matlab的help文档对这些函数做一些小小的总结


    fsolve函数

    用来求解非线性方程组F(x)=0;当中,x是一个向量或者矩阵,F(x)的返回值是一个vector。以下是详细用法(以x0为初始点。利用优化算法寻找函数fun(x)与y=0的交点,即fun(x) = 0的根):

    局限性:仅仅能求解距离给定初始值近期的那个根

    一个方程的情况

    fun=x2+x+1

    • 在新的m文件里,书写该fun的计算函数
    function y = fun(x)
        y = x^2+x-6;
    end
    
    • 求解根

    初值为-1时:
    x = fsolve(@fun,-1)
    结果为:result=-3
    初值为2时:
    x = fsolve(@fun,2)
    结果为:result=2

    能够看到,当给定的初始值不同一时候。fsolve的返回值不同。这是因为。fsolve返回的是距离给定初始点较近的那个根(fsolve在计算时,由初始点開始。逐步向零点逼近,当找到零点值后,优化停止,所以。这种方式仅仅能返回距离给定初始值x0近期的那个零点)

    • options參数

    这里在求解根的时候,全部的优化參数都是使用的默认值,但实际上,优化參数能够通过options进行设置。能够设置详细优化方法(Algorithm)、是否显示每步迭代的结果(Display)、最大迭代步数(MaxIter)等, 设置方法例如以下:
    options = optimoptions('','','')
    x = fsolve(@fun,2,options )

    方程组(以包括两个方程的方程组为例)

    y={ y1=x21+x16=0y2=2x22+x26=0

    • 在新的m文件里,书写该fun的计算函数
    function y = fun(x)
        y(1) = x(1)^2+x(1)-6;
        y(2) = 2*x(2)^2+x(2)-6;
    end
    
    • 求解根

    初值为[-1,1]时:
    x = fsolve(@fun,[-1,1])
    结果为:result=[-3,1]

    初值为[2,-1]时:
    x = fsolve(@fun,2)
    结果为:result=[2,-2]


    fzero函数

    用来求解非线性方程的根f(x)=0;该函数通过推断f(x)的符号是否发生变化来计算方程的根
    详细地,假设x0是方程的根。那么。该函数在点x0+Δx0Δ处的函数值符号一定相反,所以,该函数不能用来求解相似于x2=0这种方程

    局限性:仅仅能求解距离给定初始值近期的那个根(与fsolve的局限性形同)

    以下给出一个样例:

    fun=x2+x+1

    • 在新的m文件里,书写该fun的计算函数
    function y = fun(x)
        y = x^2+x-6;
    end
    
    • 求解根

    初值为-1时:
    x = fzero(@fun,-1)
    结果为:result=-3

    初值为2时:
    x = fzero(@fun,2)
    结果为:fzero=2

    初值为区间[-5,5]时:
    x = fzero(@fun,[-2,5])
    结果为:fzero=2
    注意:当给定fzero为初识区间时,要求fun函数在区间的两个端点的符号不同

    能够看到。利用该方法求得的结果与利用fsolve的结果同样,也是仅仅能返回距离给定初始值较近的那个根

    • options參数

    这里的options參数与fsolve的设置方法同样。比如:
    options = optimoptions('','','')
    x = fzero(@fun,2,options )


    roots函数

    该函数用来求解多项式方程的根,roots能够返回多项式函数的全部根,比如,计算例如以下多项式方程的根:

    fun=x3+2

    用法例如以下:
    roots([1 0 0 2])
    这里的[1 0 0 -2]各自是x3x2x1x0的系数,结果为:
    -1.2599 + 0.0000i
    0.6300 + 1.0911i
    0.6300 - 1.0911i


    root函数

    该函数用来求解符号多项式方程的根,root能够返回符号多项式函数的全部符号根,比如,计算例如以下多项式方程的根:

    fun=x3+2

    用法例如以下:

    syms x
    p = x^3 + 2;
    result = root(p,x)
    % or result = root(x^3 + 2,x)

    结果为:
    result =
    root(x^3 + 2, x, 1)
    root(x^3 + 2, x, 2)
    root(x^3 + 2, x, 3)

    该结果是符号计算结果(即result是符号变量),假设仅仅是须要该结果作为中间过程。那么直接将result带入其它计算过程就可以,但假设须要该result的数值结果。那么能够使用vpa函数,详细地:
    result_vpa = vpa(result)
    结果例如以下:
    result_vpa =
    -1.2599210498948731647672106072782
    0.62996052494743658238360530363911 + 1.0911236359717214035600726141898i
    0.62996052494743658238360530363911 - 1.0911236359717214035600726141898i
    这三个数值就是多项式方程fun=x3+2=0的三个根
    能够看到。与roots的计算结果同样


    方程求解函数小结

    fsolve:计算非线性方程组的某个根(距离初始值较近的)
    fzero:计算非线性方程的某个根(距离初始值较近那个)
    roots:计算多项式方程的全部根
    root:计算符号多项式方程的全部根


    Matlab的函数曲线绘制

    ezplot函数

    绘制函数曲线explot(fun)
    默认的显示区间是[-2pi, 2pi]
    实际中,能够设置显示区间,利用explot(fun,[xmin,xmax])

    • 绘制’显示函数’曲线(y=x2)
      eg1: figure;explot('x^2')
      结果例如以下:
      显示函数的绘制
      能够看到。因为没有指定曲线的x取值范围,所以是默认值[-6.28,6.28]
      eg2: figure;explot('x^2',[-1,1])
      结果例如以下:
      显示函数的绘制
      能够看到。因为设定了区间[-1,1]。所以x轴仅仅在区间[-1,1]内显示

    • 绘制’显示函数’曲线(x2y=0)
      eg1: figure;explot('x^2-y')
      结果例如以下:
      显示函数的绘制
      能够看到,因为没有指定曲线的x取值范围,所以是x、y轴的默认值都是[-6.28,6.28]、[-6.28,6.28]
      eg2: figure;explot('x^2',[-1,1,-1,1])
      结果例如以下:
      显示函数的绘制
      能够看到。因为设定了区间[-1,1,-1,1],所以x轴、y轴在区间[-1,1,-1,1]内显示

    • 利用函数句柄
      首先。定义函数句柄
      fh = @(x,y) x.^2 + y.^3 - 2*y - 1;
      然后利用ezplot绘制该函数
      ezplot(fh)
      axis equal
      实验结果例如以下:
      显示函数的绘制
      增加区间限制后
      ezplot(fh[-10,10,-10,10])
      axis equal
      实验结果例如以下:
      显示函数的绘制
      能够看到,仅仅显示了区间[-10,10,-10,10]的图像

  • 相关阅读:
    C#写入系统日志(日志位置)
    vue element enter事件
    C#记一次配置文件的坑
    C#简单解决winfrom窗体打开时候闪动
    C#语言切换
    C#textbox允许换行
    C#中窗体边框隐藏
    C#背景图片自适应
    IOC的实现原理—反射与工厂模式
    终生学习
  • 原文地址:https://www.cnblogs.com/yutingliuyl/p/7256216.html
Copyright © 2011-2022 走看看