文章目录
之前呢,在介绍矩阵的博客中写到了线性方程组的求解,今天主要学习到了非线性方程组的几种解法,来记录一下
首先呢,回顾一下线性方程组的求解
例如,求解下列方程组的解:

我们学习了矩阵运算之后,会明白 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次以上的代数方程或超越方程,很难甚至无法求得精确解,所以呢,我们大多求得都是方程组的近似根
二分法的基本原理,是数学中的零点定理:
设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


【例】 用迭代法求方程 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 的向量的收敛值便可得到根的值

对于多项式函数来说
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
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
%用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发生了太多的事情,一场疫情改变了所有人的生活,我已经快忘记没有疫情的日子了,就像是我不曾记起儿时对过年的欣喜与期盼。不知道为什么,今天的自己心情那么低落,就让糟糕的心情留在今年吧,新年快乐,明年再见。
我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co
我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何
我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah
我有一个表单,其中有很多字段取自数组(而不是模型或对象)。我如何验证这些字段的存在?solve_problem_pathdo|f|%>... 最佳答案 创建一个简单的类来包装请求参数并使用ActiveModel::Validations。#definedsomewhere,atthesimplest:require'ostruct'classSolvetrue#youcouldevencheckthesolutionwithavalidatorvalidatedoerrors.add(:base,"WRONG!!!")unlesss
我想向我的Controller传递一个参数,它是一个简单的复选框,但我不知道如何在模型的form_for中引入它,这是我的观点:{:id=>'go_finance'}do|f|%>Transferirde:para:Entrada:"input",:placeholder=>"Quantofoiganho?"%>Saída:"output",:placeholder=>"Quantofoigasto?"%>Nota:我想做一个额外的复选框,但我该怎么做,模型中没有一个对象,而是一个要检查的对象,以便在Controller中创建一个ifelse,如果没有检查,请帮助我,非常感谢,谢谢
我有一些非常大的模型,我必须将它们迁移到最新版本的Rails。这些模型有相当多的验证(User有大约50个验证)。是否可以将所有这些验证移动到另一个文件中?说app/models/validations/user_validations.rb。如果可以,有人可以提供示例吗? 最佳答案 您可以为此使用关注点:#app/models/validations/user_validations.rbrequire'active_support/concern'moduleUserValidationsextendActiveSupport:
对于Rails模型,是否可以/建议让一个类的成员不持久保存到数据库中?我想将用户最后选择的类型存储在session变量中。由于我无法从我的模型中设置session变量,我想将值存储在一个“虚拟”类成员中,该成员只是将值传递回Controller。你能有这样的类(class)成员吗? 最佳答案 将非持久属性添加到Rails模型就像任何其他Ruby类一样:classUser扩展解释:在Ruby中,所有实例变量都是私有(private)的,不需要在赋值前定义。attr_accessor创建一个setter和getter方法:classUs
我有一个正在构建的应用程序,我需要一个模型来创建另一个模型的实例。我希望每辆车都有4个轮胎。汽车模型classCar轮胎模型classTire但是,在make_tires内部有一个错误,如果我为Tire尝试它,则没有用于创建或新建的activerecord方法。当我检查轮胎时,它没有这些方法。我该如何补救?错误是这样的:未定义的方法'create'forActiveRecord::AttributeMethods::Serialization::Tire::Module我测试了两个环境:测试和开发,它们都因相同的错误而失败。 最佳答案
ruby如何管理内存。例如:如果我们在执行过程中采用C程序,则以下是内存模型。类似于这个ruby如何处理内存。C:__________________|||stack|||------------------||||------------------|||||Heap|||||__________________|||data|__________________|text|__________________Ruby:? 最佳答案 Ruby中没有“内存”这样的东西。Class#allocate分配一个对象并返回该对象。这就是程序
我正在使用Rails3.1并在一个论坛上工作。我有一个名为Topic的模型,每个模型都有许多Post。当用户创建新主题时,他们也应该创建第一个Post。但是,我不确定如何以相同的形式执行此操作。这是我的代码:classTopic:destroyaccepts_nested_attributes_for:postsvalidates_presence_of:titleendclassPost...但这似乎不起作用。有什么想法吗?谢谢! 最佳答案 @Pablo的回答似乎有你需要的一切。但更具体地说...首先改变你View中的这一行对此#