割线法数值求解方程
割线法(Secant Method)是一种数值求解方程的方法,特别是单变量函数的零点求解。它是一种迭代方法,不像二分法那样需要函数在区间两端异号,而是利用函数在两个点上的函数值来迭代逼近零点。以下是割线法数值求解方程的求解步骤:
求解步骤割线法求解多元方程的步骤如下:
步骤1: 选择初始点,选取两个初始点 和 。步骤2: 计算割线斜率,步骤3: 构造迭代公式,利用割线斜率和区间端点值构造迭代公式:
步骤4: 迭代,重复步骤2和步骤3,利用迭代公式计算 ,并检查是否满足停止准则,比如函数值的改变小于某个预设的阈值或者迭代次数超过预设的最大值。
Mathematica
使用二分法数值解方程 的近似根。首先令 ,画出 的图形:
In[]:=
12f[x_] = x^2 - x;Plot[f[x], {x, -1, 2}]
Out[]:=
可以看出方程有两个根,大致在 0 和 1 附近,我们选取 0.4 和 1.5 为例在 mathematica 中数值求解:
In[]:=
123456789x[-1] = 0.4; x[ ...
牛顿法+共轭梯度法数值求解二维热传导方程
上次在《牛顿法数值求解二维热传导方程》中使用牛顿法(Newton’s method)数值求解二维热传导方程。本次附上牛顿法和共轭梯度法结合数值求解二维热传导方程的完整代码。
牛顿法+共轭梯度法数值求解二维热传导方程
In[]:=
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576(*Mathematica自身求解*)\[CapitalOmega] = ImplicitRegion[1 <= x^2 + y^2 <= 4, {x, y}];uSol = NDSolveValue[{D[u[x, y], {x, 2}] + D[u[x, y], {y, 2}] == u[x, y], DirichletCondition[u[x, y] == 1, x^2 + y^2 == 1], DirichletCondition[u[ ...
牛顿法+共轭梯度法数值求解泊松方程
上次在《牛顿法数值求解泊松方程》中使用牛顿法(Newton’s method)数值求解泊松方程。思路是将微分方程离散化成非线性方程组,然后使用牛顿法将非线性方程组简化成求解线性方程组,之后又介绍了《共轭梯度法数值求解线性方程组》。有朋友尝试将两者结合,发现求解出了问题,本次就附上完整代码以证明之前的牛顿法和共轭梯度法都没有任何问题。
牛顿法+共轭梯度法数值求解泊松方程
In[]:=
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667(*Mathematica自身求解*)uSol[x_] = NDSolveValue[ {u''[x] + u'[x] + u[x]^2 + x == 0, u[0] == 0, u[1] == 0}, u[x], {x, 0, 1}](*共轭梯度法*)ConjugateGradient[A_, b_] := Module[{x, r, r ...
双共轭梯度法数值求解线性方程组
上次讲解了《共轭梯度法数值求解线性方程组》,本次讲解一下双共轭梯度法数值求解线性方程组。
双共轭梯度法(英语:Biconjugate gradient method)是共轭梯度梯度法的一个变种,在数值线性代数中,是一种求解任意(包括实对称正定)矩阵的线性方程组
的迭代方法。该方法将方程左右均乘以矩阵 的共轭转置 :
双共轭梯度法求解 ,等价于最小化下面的二次函数:
双共轭梯度法的推导就不讲解了,推导方法和《共轭梯度法的推导》非常类似,下面直接写出算法。
Mathematica12345678910111213141516171819202122232425262728ConjugateGradient2[A_, b_] := Module[{x, r, p, k, \[Lambda], s, \[Mu], n = Length[b]}, x[0] = Table[0., n]; r[0] = b - A . x[0]; p[0] = s[0] = ConjugateTranspose[A] . r[0]; k = 0; Print[Norm[r[k]] ...
共轭梯度法和梯度下降法的对比
上次在《共轭梯度法的推导》讲解了共轭梯度法和梯度下降法的推导,本次用实例看一下它们之间的差异。
共轭梯度法12345678910111213141516171819202122232425ConjugateGradient1[A_, b_] := Module[{x, r, p, k, \[Alpha], \[Beta], n = Length[b]}, x[0] = Table[0., n]; r[0] = b - A . x[0]; p[0] = r[0]; k = 0; Print[Norm[r[k]]/n, ",", x[k]]; While[k < 100, \[Alpha][k] = ConjugateTranspose[r[k]] . r[k]/ ConjugateTranspose[p[k]] . A . p[k]; x[k + 1] = x[k] + \[Alpha][k] p[k]; r[k + 1] = r[k] - \[Alpha][k] (A . p[k]); Print[Norm[r[k + 1]] ...
共轭梯度法的推导
上次讲解了《共轭梯度法数值求解线性方程组》,应好友的邀请,本次讲解一下共轭梯度法的推导。
在数值线性代数中,共轭梯度法是一种求解对称正定线性方程组的迭代方法。
A 是实对称正定矩阵求解 ,其中 𝐴 是实对称正定矩阵,等价于最小化下面的二次函数:
从下面的推导就可以看出。最小化二次函数就是将 对 x 求偏导然后令其等于 0:
由于 𝐴 是实对称正定矩阵 (下面的推导要时刻注意这点),因此上式等价于 。
共轭梯度法的推导从初始的猜测 出发,相应的残差为 ,我们构造 x 的迭代式:
意思就是下一步的 x 是由上一步的 x 平移 ,平移的方向由 决定,该方向可以任意选择,无非是有些选择不能收敛,有些收敛的比较慢,有些收敛地比较快。为了演示不同的选择有不同的收敛速度,下面准备选择两种作为对比:梯度下降法和共轭梯度法。
将迭代式代入 中
最小化二次函数将 对 求导然后令其等于 0:
由于残差 从而得到
梯度下降法如果选择 那么
我们计算一下 的梯度发现
也就是梯度下降最快的方向。
共轭梯度法如果选择迭代式
且 满足共轭性,即对于 :
那么
...
共轭梯度法数值求解线性方程组
之前在数值求解柏松方程以及热传导方程的讲解中,离散化之后会形成一系列的非线性方程组,然后又讲解了如何使用牛顿法求解该非线性方程组,最终发现问题转化成了形如:线性方程组的数值求解。之前都是简单的使用 Mathematica 的 FindRoot[] 和 NSolve[] 函数求解,本次利用共轭梯度法数值求解线性方程组。这样一步一步拆解、简化问题是具有启发性的,能够一步一步帮助我们解决问题。
共轭梯度法共轭梯度法(英语:Conjugate Gradient Method)是求解系数矩阵为对称正定矩阵的线性方程组的数值解的方法。共轭梯度法是一个迭代方法,它适用于系数矩阵为稀疏矩阵的线性方程组,因为使用像Cholesky分解这样的直接方法求解这些系统所需的计算量太大了。这种方程组在数值求解偏微分方程时很常见。
A 是实对称正定矩阵求解 ,其中 𝐴 是实对称正定矩阵
结果为
Mathematica123456789101112131415161718192021222324ConjugateGradient1[A_, b_] := Module[{x, r, p, k, \[Al ...
牛顿法数值求解二维热传导方程
上次在《牛顿法数值求解泊松方程》中讲了使用牛顿法(Newton’s method)数值求解多变量方程,并以一维泊松方程为例进行隐式求解。本次讲解使用牛顿法数值求解多维方程。迭代形式为上次所讲:
还是考虑方程:
并考虑狄利克雷边界条件:
离散求解区域:
In[]:=
12345678dx = 0.02;dy = 0.04;xGrid = Range[-2, 2, dx];yGrid = Range[-2, 2, dy];nx = Length[xGrid];ny = Length[yGrid];
方程左边以及需要求的变量:
In[]:=
123f = {};var = {};index = {};
边值条件,以及使用前面讲的离散化方法写出方程左边的差分形式:
In[]:=
123456Do[If[xGrid[[i]]^2 + yGrid[[j]]^2 <= 1, u[i, j] = 1, If[xGrid[[i]]^2 + yGrid[[j]]^2 >= 4, u[i, j] = 0, (AppendTo[f ...
牛顿法数值求解泊松方程
上次在《牛顿法数值求解方程》中讲了使用牛顿法(Newton’s method)数值求解单变量方程。这次使用牛顿法数值求解多变量方程,并以泊松方程为例进行隐式求解,参考《隐式法数值求解泊松方程》。该方法极其实用,如此精妙的算法我都舍不得分享😂
使用牛顿法数值求解多变量方程无非是将单变量形式:
变成:
其中 为未知变量组成的向量, 为方程不为零的那边组成的向量,
为雅可比矩阵。
为求 ,需要求解线性方程组 ,其中 为未知向量。解此线性方程组可以使用共轭梯度法(Conjugate gradient method),以后有机会会介绍此方法。Mathematica 中求线性方程组的方法为 LinearSolve[]。
牛顿法数值求解一维泊松方程还是考虑普遍的形式:
并考虑边值条件:
将 x 的范围从 0 到 1 分割成 100 份:
In[]:=
123h = 0.01;n = Floor[1/h]xGrid = Range[0, 1, h];
边值条件,以及使用前面讲的离散化方法写出方程左边的差分形式:
In[]:=
1234u[0] = 0; ...
Mathematica解线性规划
线性规划(英语:Linear Programming,简称 LP)特指目标函数和约束条件皆为线性的最优化问题。线性规划在工程、经济、管理等领域广泛应用,例如生产计划、资源分配、运输问题、物流优化、金融风险管理、投资组合优化等问题都可以用线性规划来建模和求解。在微观经济学和商业管理领域中,线性规划亦被大量应用于例如降低生产过程的成本等手段,最终提升产值与营收。对线性规划有早期贡献的列昂尼德·维塔利耶维奇·康托罗维奇和特亚林·科普曼斯于1975年共同获得诺贝尔经济学奖。
线性规划问题的基本形式如下:
目标函数:一个或多个线性函数(最小化或最大化)
约束条件:一系列线性等式或不等式约束
优化变量:目标函数中的一项或多项,可以变化,目标是最优解。
解决线性规划问题通常包括以下步骤:
确定问题:首先明确问题的目标函数和约束条件。
构造线性规划标准形式:将原始问题转化为标准形式。目标函数 或,其中 是常数, 是变量。约束条件可以是等式也可以是不等式,或或。
寻找最优解:通过一些数学方法(例如,单纯形法)求解上述线性规划问题,得到最优解。
线性规划可以通过各种方法 ...