草庐IT

MATLAB求解非线性方程模型

苓诣 2023-12-12 原文

文章目录


前言

之前呢,在介绍矩阵的博客中写到了线性方程组的求解,今天主要学习到了非线性方程组的几种解法,来记录一下


一、线性方程组求解

首先呢,回顾一下线性方程组的求解
例如,求解下列方程组的解:

我们学习了矩阵运算之后,会明白 x=A \ b 即为线性方程组 A*x = b 的解,因此,书写代码也很容易

A=[2 2 -1 1;4 3 -1 2;8 3 -3 4;3 3 -2 -2];
b=[4 6 12 6]';
x=A\b %等价于 x=inv(A)*b

二、非线性方程组的几种解法

接下来呢,是今天的主角,关于非线性方程组的几种求解方法
首先呢,先介绍一下非线性方程组的形式

f(x)=0
代数方程: f(x)=a0 + a1 x+……+an x^n (an ~= 0)
超越方程 :f(x)中含三角函数、指数函数、或其他超越函数。

一般稍微复杂的3次以上的代数方程或超越方程,很难甚至无法求得精确解,所以呢,我们大多求得都是方程组的近似根

1.二分法

二分法的基本原理,是数学中的零点定理:
设f(x)是区间[a,b]上的连续函数,并且f(a)f(b)<0,则存在 ξ \xi ξ ∈ \in (a, b)使得 f ( ξ \xi ξ) = 0。

二分法求根的基本思想:首先确定有根区间,将区间二等分,通过判断f(x)的符号,逐步将有根区间缩小,直至有根区间足够地小,便可求出满足精度要求的近似根

设方程f(x)=0在区间[a,b]内有根,二分法就是逐步收缩有根区间,最后得出所求的根。算法步骤如下:
1.输入a,b,ε的值
2. 计算f(a), f(b)
3. 如果f(a)f(b)≤0 ,则说明[a,b]是有根区间,反复执行如下操作:
a) 计算区间中点m=(a+b)/2
b) 计算f(m)
c) 如果 f(a)f(m)<=0,则令 b=m
否则, 令 a=m
d) 如果 |a-b|<ε,则令 x=m, 结束;否则,继续执行a-c

二分法的代码如下:

function root = Erfen(f, a, b, epsilon)
%功能:二分法求非线性方程f(x)=0的根
%输入参数:
%f是表示非线性函数f(x)的参数(变量),数据类型:函数句柄对象
%a--区间左端点, b--区间右端点, epsilon--控制精度的参数
%输出参数
%root--非线性方程f(x)= 0[a, b]内的根
if f(a)*f(b)>0
    root=NaN;      %无解
    return
end

while b-a>epsilon
    m=(a+b)/2;
    if f(a)*f(m)<=0
        b=m;
    else
        a=m;
    end
end

root=(a+b)/2;

end

函数调用如下:

>> f=@(x) x^3-2*x-5;
>> root=Erfen(f,2,3,1e-6)

root =

    2.0946

2.迭代法


【例】 用迭代法求方程 x^3 - x - 1 = 0在x=1.5 附近的一个根。

分析:可以将方程改写成如下两种等价形式:
x = ϕ \phi ϕ 1(x) = x + 1 3 \sqrt[3]{x + 1} 3x+1                 (1)
x = ϕ \phi ϕ 2(x) = x3 - 1                      (2)
相应地可以得到两个迭代公式:
x k + 1 x_{k+1} xk+1 = ϕ \phi ϕ 1 ( x k x_{k} xk) = x k + 1 3 \sqrt[3]{xk + 1} 3xk+1
x k + 1 x_{k+1} xk+1 = ϕ \phi ϕ 2 ( x k x_{k} xk) = x k x_{k} xk3 - 1

通过编写代码画图我们可以看到

%x(k+1)=(x(k)+1) ^(1/3) ——收敛
x=zeros(1,100);
x(1)=1.5;
for k=1:99
    x(k+1)=(x(k)+1) ^(1/3);
end
plot(x)

%x(k+1) = x(k) ^3 - 1;  ——不收敛
x=zeros(1,100);
x(1)=1.5;
for k=1:99
    x(k+1) = x(k) ^3 - 1;
end
plot(x)


通过命令控制台查看 x 的向量的收敛值便可得到根的值

3.MATLAB内置求解方程函数

1)roots函数

对于多项式函数来说
Matlab提供了多种多项式计算函数,如
求多项式的值,polyval;
多项式乘法,conv;
多项式除法,deconv;
多项式微分,polyder;
多项式拟合,polyfit;
多项式求根函数, roots

r = roots( c ),用于求解多项式的根
其中,行向量c的元素是多项式的系数,按多项式次数降序排列
如果c中含有n+1个元素,则多项式为n次
roots可以获得多项式的所有根
其算法为计算伴随矩阵的特征值

>> %求x^3=x^2+1 
>> %f(x) = x^3 - x^2 -1 = 0 
>> c=[1, -1, 0, -1 ]

c =

     1    -1     0    -1

>> r=roots(c)

r =

   1.4656 + 0.0000i
  -0.2328 + 0.7926i
  -0.2328 - 0.7926i

>> polyval(c,r)

ans =

   1.0e-15 *

   0.4441 + 0.0000i
   0.2220 + 0.1110i
   0.2220 - 0.1110i

2)fzero函数

fzero
对于一般的单个超越方程,可以采用fzero函数求解
fzero函数结合使用二分法、割线法和可逆二次内插法
其用法大致为:

>> x=fzero(@sin,3)

x =

    3.1416

>> format long
>> x

x =

   3.141592653589793

>> x=fzero(@cos,[1,2])

x =

   1.570796326794897

>> x=fzero(@cos,[0, 2*pi])

错误使用 fzero (line 290)
区间端点处的函数值必须具有不同的符号。

>> x=fzero(@(x)x^3-2*x-5,1)

x =

   2.094551481542327

3)fsolve函数

%用fslove求解线性方程组
%sin(x)+y^2+log(z)=7
%3*x+2y-z3+1=0
%x+y+z=5
%方法:
%1.首先把方程组写成F(X)=0这种形式
%2.定义函数Y=F(X)
%F(X)的输入参数是由所有未知数构成的向量,在本例题中X=[ x, y, z]
%输出参数(函数值)Y是列向量
%Y(i)是当X=[x, y, z]给定时,第i个方程的左边减去右边的值
%3.调用fslove求解方程组的解

function Y=test_fun3(X)
%输入参数X表示由方程组的未知数[ x, y, z]构成的向量
%输出参数Y是一个列向量,Y(i)=第i个方程的左端减右端
x=X(1);
y=X(2);
z=X(3);
Y=[sin(x)+y^2+log(z)-7;3*x+2^y-z^3+1;x+y+z-5];
end

函数调用求解代码:

>> x0 = [1 1 1];
>> x=fsolve(@test_fun3,x0)
x =

   0.599053756637426   2.395931402383216   2.005014840979314


随笔

今天又是匆匆忙绿的一天,探望很久没见的老师,理掉了好久没理的头发,办理了快要过期的身份证,更换了佩戴好久的眼镜,陪老朋友吃饭叙了好久的旧……缓过头来才意识到,今天是2021的最后一天。今天和朋友叙旧,谈到了曾经的时光,那时候我们有梦,关于文学,关于爱情,关于穿越世界的旅行,如今我们开始饮酒,杯子碰到一起,都是梦破碎的声音。时常会刷到朋友圈中,曾经的好友光鲜亮丽的美好生活,羡慕着他们找到了自己的生活方式,与此同时,也伴随着自身的迷茫与苦涩。不知从什么时候开始,自己便像一个上了发条的玩具,不断地奔跑,不断地前进,遗落了曾经拥有的,追寻着虚无缥缈的。或许是身上被寄予了太多的期望,在前进疲惫的路上总是感觉到分外的压力。人们总说,人心的偏见像一座大山,压得人喘不过气,人类的期望又何尝不是如此。屠龙少年终成恶龙,人最终还是活成了别人眼中希望的样子。晚上走在灯火通明的街道,我与节日的祥瑞与和谐显得格格不入,2021发生了太多的事情,一场疫情改变了所有人的生活,我已经快忘记没有疫情的日子了,就像是我不曾记起儿时对过年的欣喜与期盼。不知道为什么,今天的自己心情那么低落,就让糟糕的心情留在今年吧,新年快乐,明年再见。

有关MATLAB求解非线性方程模型的更多相关文章

  1. ruby-on-rails - Rails - 子类化模型的设计模式是什么? - 2

    我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co

  2. ruby-on-rails - Rails - 一个 View 中的多个模型 - 2

    我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何

  3. ruby-on-rails - 在混合/模块中覆盖模型的属性访问器 - 2

    我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah

  4. ruby-on-rails - 如何验证非模型(甚至非对象)字段 - 2

    我有一个表单,其中有很多字段取自数组(而不是模型或对象)。我如何验证这些字段的存在?solve_problem_pathdo|f|%>... 最佳答案 创建一个简单的类来包装请求参数并使用ActiveModel::Validations。#definedsomewhere,atthesimplest:require'ostruct'classSolvetrue#youcouldevencheckthesolutionwithavalidatorvalidatedoerrors.add(:base,"WRONG!!!")unlesss

  5. ruby-on-rails - form_for 中不在模型中的自定义字段 - 2

    我想向我的Controller传递一个参数,它是一个简单的复选框,但我不知道如何在模型的form_for中引入它,这是我的观点:{:id=>'go_finance'}do|f|%>Transferirde:para:Entrada:"input",:placeholder=>"Quantofoiganho?"%>Saída:"output",:placeholder=>"Quantofoigasto?"%>Nota:我想做一个额外的复选框,但我该怎么做,模型中没有一个对象,而是一个要检查的对象,以便在Controller中创建一个ifelse,如果没有检查,请帮助我,非常感谢,谢谢

  6. ruby-on-rails - 如何将验证与模型分开 - 2

    我有一些非常大的模型,我必须将它们迁移到最新版本的Rails。这些模型有相当多的验证(User有大约50个验证)。是否可以将所有这些验证移动到另一个文件中?说app/models/validations/user_validations.rb。如果可以,有人可以提供示例吗? 最佳答案 您可以为此使用关注点:#app/models/validations/user_validations.rbrequire'active_support/concern'moduleUserValidationsextendActiveSupport:

  7. ruby-on-rails - Rails 模型——非持久类成员或属性? - 2

    对于Rails模型,是否可以/建议让一个类的成员不持久保存到数据库中?我想将用户最后选择的类型存储在session变量中。由于我无法从我的模型中设置session变量,我想将值存储在一个“虚拟”类成员中,该成员只是将值传递回Controller。你能有这样的类(class)成员吗? 最佳答案 将非持久属性添加到Rails模型就像任何其他Ruby类一样:classUser扩展解释:在Ruby中,所有实例变量都是私有(private)的,不需要在赋值前定义。attr_accessor创建一个setter和getter方法:classUs

  8. ruby-on-rails - Rails - 从另一个模型中创建一个模型的实例 - 2

    我有一个正在构建的应用程序,我需要一个模型来创建另一个模型的实例。我希望每辆车都有4个轮胎。汽车模型classCar轮胎模型classTire但是,在make_tires内部有一个错误,如果我为Tire尝试它,则没有用于创建或新建的activerecord方法。当我检查轮胎时,它没有这些方法。我该如何补救?错误是这样的:未定义的方法'create'forActiveRecord::AttributeMethods::Serialization::Tire::Module我测试了两个环境:测试和开发,它们都因相同的错误而失败。 最佳答案

  9. ruby-on-rails - Ruby 中的内存模型 - 2

    ruby如何管理内存。例如:如果我们在执行过程中采用C程序,则以下是内存模型。类似于这个ruby如何处理内存。C:__________________|||stack|||------------------||||------------------|||||Heap|||||__________________|||data|__________________|text|__________________Ruby:? 最佳答案 Ruby中没有“内存”这样的东西。Class#allocate分配一个对象并返回该对象。这就是程序

  10. ruby-on-rails - Rails 3.1 中具有相同形式的多个模型? - 2

    我正在使用Rails3.1并在一个论坛上工作。我有一个名为Topic的模型,每个模型都有许多Post。当用户创建新主题时,他们也应该创建第一个Post。但是,我不确定如何以相同的形式执行此操作。这是我的代码:classTopic:destroyaccepts_nested_attributes_for:postsvalidates_presence_of:titleendclassPost...但这似乎不起作用。有什么想法吗?谢谢! 最佳答案 @Pablo的回答似乎有你需要的一切。但更具体地说...首先改变你View中的这一行对此#

随机推荐