⑴ 如何求含n个参数的非线性方程组的通解
1、对增广矩阵B施行初等行变换化州蠢为行阶梯形。若R(A)<R(B),则方程组无解。
2、若R(A)=R(B),则进一步将B化为行最简形。
3、设R(A)=R(B)=r;把行最简形中r个非零行的非0首元所对应森此的未知数用其余n-r个未知数(自由未知数)表示,并令自由未知数分别等于
即可写出含n-r个参数的通解。
(1)非线性方程组求解算法扩展阅读:
非齐次线性方程组的通解=齐次线性方程组的通解+非齐次线性方程组的一个特解(η=ζ+η*)
非齐次册春陪线性方程组Ax=b有解的充分必要条件是:系数矩阵的秩等于增广矩阵的秩,即rank(A)=rank(A, b)(否则为无解)。
非齐次线性方程组有唯一解的充要条件是rank(A)=n。
非齐次线性方程组有无穷多解的充要条件是rank(A)<n。(rank(A)表示A的秩)
⑵ 非线性方程组解法
非线性方程组可以表示为:
在位移为基本未知量的有限元分析中, 是结点位移向量, 是结点载荷向量。对于线性方程组 ,由于 是常数矩阵,可以没有困难直接求解。对于非线性方程组需要迭代求解。
只适用于与变形历史无关的非线性问题,例如非线性弹性问题,利用形变理论分析的弹塑性问题,稳态蠕变问题等。对于依赖于变形历史的非线性问题,应力需要由应变所经历的路径决定,直接迭代法不适用。例如加载路径不断变化或涉及卸载和反复加载等弹塑性问题。此时要利用增量理论。
可以指出,当 是凸曲线(如图所示),其中 是标量,即系统为单自由度情形,通常解收敛。
(1)方程可以改写为
选择一个初始的试探解 代入上式可以得到初始的 ,接着可以得到第一步迭代的位移解 ,由此类推得到第 次迭代后的近似解 ,一直到误差的某种范数小于某个规定的容许小量 ,即 ,上述迭代终止。
为避免每次迭代对刚度矩阵 进行求逆计算,一般可以将刚度矩阵设定为常数进行迭代过程,单自由度系统下的常刚度直接迭代法如图所示
一般情况下,(1)不能被精确地满足,即 ,为了得到进一步的近似解 (假设 为某单自由度方向上的位移) ,将 表示成在 附近的仅保留线性项的Taylor展开式
且有
式中 是切线矩阵(tangent matrix),即
其迭代过程如图所示
核心思想是将载荷分解成若干增量步,即 ,相应的位移也分为同样的步数,即 ,每两步之间的增长量称之为增量。增量解法的一般做法是假设第 步的载荷 和相应的位移 为已知,然后将载荷增加为 ,如果每一步的载荷增量 足够小,则解的收敛性可以保证。
使用增量法的(1)式改写为如下形式(位移均以单自由度为例)
,其中 是用来表示载荷变化的参数,将上式对 求导,可以得到
其中 为定义的切线刚度矩阵。
(4)式是一典型的常微分方程组问题,下面介绍的是有限元中对这类方程组的求解方法
1.欧拉方法(单自由度为例)
显然为了满足精度要求, 必须是足够小的量。使用Runge-Kutte方法可以改善精度
此方法会导致解的漂移(与真实曲线上的解产生较大的误差)
为了克服每一增量步解的误差可能导致的解的漂移,可以将(5)式改写为
这里解释一下
此方法称为考虑平衡矫正的欧拉增量方法,即将前增量步的载荷和内力的不平衡量合并到当前增量步求解,一定程度上避免了解的漂移。
2.N-R方法
为了改进欧拉法的精度,现在更多采用N-R方法,如果采用N-R方法,是在每一增量步内进行迭代
则对于 的 次增量步的第 次迭代可以表示为
表示成前述的N-R形式为
采用mN-R迭代
利用mN-R方法求解非线性方程组时,可以避免每次迭代重新形成和求逆切线矩阵,但是降低了收敛速度,特别是 曲线突然趋于平坦的情况
有Aitken加速的迭代和无Aitken加速的迭代如图所示
在研究载荷增量步长自动选择的方法时,首先是假设载荷的分布模式是给定的,变化的只是他的幅值,在此情况下,外载荷可以表示为:
等效结点载荷向量可以表示为:
是载荷幅值,载荷分布实际是 的分布
求解上述载荷分布方程依然是一个N-R迭代过程,设
是经过n+1次迭代修正后得到的 数值
下面是几种常用的自动选择载荷步长的方法
此方法对于计算结构的极限载荷很有效,利用本步刚度参数可以使步长调整的比较合理,并可以减少总的增量步数,适合于计算由理想弹塑性材料组成结构的极限载荷情况。
第i增量步结构的总体刚度可用下式度量
初始结构总体刚度的度量是
其中 和 是载荷向量和按弹性分析得到的位移向量。
(1) 利用”本步刚度参数“的规定变化量自动选择增量步长。
称为第i步的”本步刚度参数“,它代表结构本身的刚度性质,与载荷增量大小无关,当结构处于完全弹性时, ,随着塑性区扩大,结构变软, 逐渐减小,到达极限载荷时,
对于比例加载的情况:
是极限载荷参数, 是 时的结点载荷向量
利用本步刚度参数可以使步长调整得比较合理,并可以减少总的增量步
(2) 增量步长的自动选择
利用(1)得到的”本步刚度参数“的规定变化量自动选择增量步长,具体的算法步骤如下
1、求弹性极限载荷参数
先施加任意载荷 ,假定结构为完全弹性求解,求出结构的最大等效应力 ,则有
是材料的初始屈服应力
2、给定第一步载荷参数增量 的值可以事先给定,用 求解第一增量步
3、给定第二及以后各增量步的刚度参数变化的预测值 ,其大小决定步长的大小,例如可在0.05~0.2之间选择,并给定刚度的最小允许值 ,则每步载荷参数增量为
然后用 求解第 增量步
然后可以通过(1)中的公式计算出”本步刚度参数“
以 迭代为例,它可以表示为
在载荷增量步长自动控制的求解方法中, 可以表示成
其中
以上两式中:
因此(7)可以改写为
其中
是在第 次迭代中由某个规定的约束条件来确定的载荷因子增量 的第 次修正量。在现在的方法中,这个条件就是某个结点的位移增量的大小,例如规定 中的最大分量 是给定的,此条件可以表示为
其中 是 的规定值, 是除第g个元素为1,其余元素为零的向量,具体迭代算法步骤如下:
(1)计算对于节点载荷模式 的位移模式 ,即
(2)计算对于不平衡结点力向量 的位移增量修正值 和 次迭代后位移增量修正值的全量 ,即
其中 是待定载荷因子增量的修正值
(3)利用条件(8)确定 ,由于
从上式可以得到
这样就确定了第 次迭代后的载荷因子增量
载荷因子增量求出之后,可以知道每一步的外载荷,从而使用 法迭代得到位移,进而求出应变,应力和当前增量步的内力等物理量。并检验收敛准则是否满足,如未满足,回到步骤二进行新的一次迭代,直至收敛准则满足为止。 关于每一个增量步某个指定结点位移增量 本身的选择,通常的方法是第1个增量步可以由某个给定的载荷因子增量 (例如令 ,其中p_e是弹性极限载荷因子, 可取5~10),通过求解得到 ,以后各增量步的 可由下式确定,即
其中
以上是王勖成的有限单元法给出的非线性方程组解法以及一些提高运算效率的策略,如有补充或者理解偏差,请联系指正。
⑶ 牛顿迭代法解非线性方程组
一元非线性方程的牛顿迭代公式和原理
以一元非线性方程 f(x)=0 为例,对函数 f(x)进行Taylor级数展开(只展开至线性项)得
f(x) = f(x0)+f'(x0)(x-x0)
所以方程可写成
f(x0)+f'(x0)(x-x0) = 0
其中x0是给定的已知值,肆胡源则不难推导出方程的解(当然,只是近似解,毕竟Taylor展开过程中只取了线性项)
x = x0 - f(x0) / f'(x0)
其中x不是真实解,但是相比之前的x0更靠近真实解了,因此可以多重复几次上述过做脊程,裂态从而使得到的解非常接近准确值。所以,对于一元非线性方程,牛顿拉夫逊迭代公式为:
x(k+1) = x(k) - f(x(k))/ f'(x(k))
根据Taylor级数的几何意义我们可以从几何上形象的看牛顿迭代法的求解f(x)=0的过程。
第一次迭代x1 = x0 - f(x0)/ f'(x0),其中f(x0)/ f'(x0)的几何意义很明显,就是x0到x1的线段长度(这可以从直角三角形的知识得到)。第二次迭代x2= x1 - f(x1)/ f'(x1),其中f(x1)/ f'(x1)的几何意义很明显,就是x1到x2的线段长度。同理可以进行第三次迭代第四次迭代,可以明显的看出x的取值在不断逼近真实解x*。
⑷ 非线性方程组数值解法的割线法
若对方程组 (1)线性化时使用插值方法确定线性方程组
(6)
中的Ak和bk,则可得到一类称为割线法的迭代序列。假定已知第k步近似尣k,为确定Ak和bk,可在尣附近取n个辅助点у忋(j=1,2,…,n),使n个向量
线性无关,由插值条件可知
由此可求得
由(6)解得
以此作为方程 (1)的新近似,记作
,于是得到
(7)
(7)称为解非线性方程组的割线法。辅助点у忋 取得不同就得到不同的割线法程序,例如取
为常数(j=1,2,…,n),就得到与(5)相同的程序,由于它只依赖于尣点的信息,故也称一点割线法,若取
它依赖于点尣及
, 称为两点割线法。其他多点割线法由于稳定性差,使用较少。
非线性方程组数值解法 - 布朗方法 布朗采用对每个分量方程 ƒi(尣)=0逐个进行线性化并逐个消元的步骤,即在每迭代步中用三角分解求线性方程组的解,得到了一个效率比牛顿法提高近一倍的迭代法,即
式中
(8)中当i=n时求得xn记作
,再逐次回代,求出
(i=n-1,n-2,…,1)就完成了一个迭代步。布朗迭代程序的敛速仍保持p=2,而每一迭代步的工作量
,故效率
对这方法还可与牛顿法一样进行改进,得到一些效率更高的算法。这类方法是70年代以来数值软件包中常用的求解非线性方程组的算法。
非线性方程组数值解法 - 拟牛顿法 为减少牛顿法的计算量,避免计算雅可比矩阵及其逆,60年代中期出现了一类称为拟牛顿法的新算法,它有不同的形式,常用的一类是秩1的拟牛顿法,其中不求逆的程序为
式中
,
,
,称为逆拟牛顿公式。计算时先给出尣及 B0,由(9)逐步迭代到满足精度要求为止。每步只算 n个分量函数值及O(n)的计算量,比牛顿法一步计算量少得多。理论上已证明,当尣及B0选得合适时,它具有超线性收敛速度,但实践表明效率并不高于牛顿法,理论上尚无严格证明。
非线性方程组数值解法 - 最优化方法 求方程组 (1)的问题等价于求目标函数为
的极小问题,因此可用无约束最优化方法求问题(1)的解(见无约束优化方法)。 非线性方程组数值解法 - 连续法 又称嵌入法,它可以从任意初值出发求得方程组(1)的一个足够好的近似解,是一种求出好的迭代初值的方法。连续法的基本思想是引入参数 t∈【0,b】,构造算子H(尣,t),使它满足条件:H(尣,0)=ƒ0(尣),H(尣,b)=ƒ(尣),其中ƒ0(尣)=0的解尣0是已知,方程:
(10)
在t∈【0,b】上有解尣=尣(t),则尣(b)=尣就是方程(1)的解。当b有限时,通常取b=1,例如可构造。
(11)
这里尣是任意初值,显然H(尣,0)=0,H(尣,1)=ƒ(尣)。为了求得(10)在t=1的解尣=尣(1),可取分点0=t0<t1<…<tN=1在每个分点ti(i=1,2,…,N)上,求方程组 H(尣,ti)=0 (i=1,2,…,N) (12)
的解尣,如果取尣为初值,只要
足够小,牛顿迭代就收敛,但这样做工作量较大。已经证明,如果方程组(12)只用一步牛顿法,当t=tN=1时,再用牛顿迭代,结果仍具有2阶收敛速度。以(11)为例,得到连续法的程序为:
若H(尣,t)的偏导数Ht(尣,t)及
在D×【0,1】嶅R
上连续。且
非奇异,则由(10)对t求导可得到等价的微分方程初值问题:
(13)
于是求方程(10)的解就等价于求常微初值问题(13)的解,求(13)的解可用数值方法由t=0计算到t=tN=b得到数值解
。已经证明只要N足够大,以尣为初值再进行牛顿迭代可收敛到方程(1)的解x,这种算法称为参数微分法。
20世纪60年代中期以后,发展了两种求解非线性方程组(1)的新方法。一种称为区间迭代法或称区间牛顿法,它用区间变量代替点变量进行区间迭代,每迭代一步都可判断在所给区间解的存在惟一性或者是无解。这是区间迭代法的主要优点,其缺点是计算量大。另一种方法称为不动点算法或称单纯形法,它对求解域进行单纯形剖分,对剖分的顶点给一种恰当标号,并用一种有规则的搜索方法找到全标号单纯形,从而得到方程(1)的近似解。这种方法优点是,不要求ƒ(尣)的导数存在,也不用求逆,且具有大范围收敛性,缺点是计算量大。
⑸ 数值随机化算法求非线性方程组
参见博文:http://blog.csdn.net/liufeng_king/article/details/9029091
//随机化算法 解线性方程组
#include "stdafx.h"
#include "RandomNumber.h"
#include <iostream>
using namespace std;
bool NonLinear(double *x0,double *dx0,double *x,double a0,
double epsilon,double k,int n,int Steps,int M);
double f(double *x,int n);
int main()
{
double *x0, //根初值
*x, //根
*dx0, //增量初值
a0 = 0.0001, //步长
epsilon = 0.01, //精度
k = 1.1; //步长变参
int n = 2, //方程个数
Steps = 10000, //执行次数
M = 1000; //失败次数
x0 = new double[n+1];
dx0 = new double[n+1];
x = new double[n+1];
//根初值
x0[1] = 0.0;
x0[2] = 0.0;
//增量初值
dx0[1] = 0.01;
dx0[2] = 0.01;
cout<<"原方程组为:"<<endl;
cout<<"x1-x2=1"<<endl;
cout<<"x1+x2=3"<<endl;
cout<<"此方程租的根为:"<<endl;
bool flag = NonLinear(x0,dx0,x,a0,epsilon,k,n,Steps,M);
while(!flag)
{
flag = NonLinear(x0,dx0,x,a0,epsilon,k,n,Steps,M);
}
for(int i=1; i<=n; i++)
{
cout<<"x"<<i<<"="<<x[i]<<" ";
}
cout<<endl;
return 0;
}
//解非线性方程组的随机化算法
bool NonLinear(double *x0,double *dx0,double *x,double a0,
double epsilon,double k,int n,int Steps,int M)
{
static RandomNumber rnd;
bool success; //搜索成功标志
double *dx,*r;
dx = new double[n+1]; //步进增量向量
r = new double[n+1]; //搜索方向向量
int mm = 0; //当前搜索失败次数
int j = 0; //迭代次数
double a = a0; //步长因子
for(int i=1; i<=n; i++)
{
x[i] = x0[i];
dx[i] = dx0[i];
}
double fx = f(x,n); //计算目标函数值
double min = fx; //当前最优值
while(j<Steps)
{
//(1)计算随机搜索步长
if(fx<min)//搜索成功
{
min = fx;
a *= k;
success = true;
}
else//搜索失败
{
mm++;
if(mm>M)
{
a /= k;
}
success = false;
}
if(min<epsilon)
{
break;
}
//(2)计算随机搜索方向和增量
for(int i=1; i<=n; i++)
{
r[i] = 2.0 * rnd.fRandom()-1;
}
if(success)
{
for(int i=1; i<=n; i++)
{
dx[i] = a * r[i];
}
}
else
{
for(int i=1; i<=n; i++)
{
dx[i] = a * r[i] - dx[i];
}
}
//(3)计算随机搜索点
for(int i=1; i<=n; i++)
{
x[i] += dx[i];
}
//(4)计算目标函数值
fx = f(x,n);
j++;
}
if(fx<=epsilon)
{
return true;
}
else
{
return false;
}
}
double f(double *x,int n)
{
return (x[1]-x[2]-1)*(x[1]-x[2]-1)
+(x[1]+x[2]-3)*(x[1]+x[2]-3);
}
⑹ 非线性方程组的解法matlab
用matlab求解非线性方程组方法,可以用下列方法来实现:
方法一,使用solve函数求解
x = optimvar('x');
y = optimvar('y');
prob = optimproblem;
prob.Objective = -x - y/3;
prob.Constraints.cons1 = x + y <= 2;
prob.Constraints.cons2 = x + y/4 <= 1;
prob.Constraints.cons3 = x - y <= 2;
prob.Constraints.cons4 = x/4 + y >= -1;
prob.Constraints.cons5 = x + y >= 1;
prob.Constraints.cons6 = -x + y <= 2;
sol = solve(prob)
方法二,使用fsolve函数求解
F = @(x) [2*x(1) - x(2) - exp(-x(1)); -x(1) + 2*x(2) - exp(-x(2))];
x0=[-5;-5];
[x,fval] = fsolve(F,x0)
方法三,使用迭代法求解,如Newton迭代法
m=3;
x0=zeros(m,1);
tol=1e-6;
x=x0-dfun(x0)\fun(x0);
n=1;
while(norm(x-x0>tol)) & n<1000
x0=x;
x=x0-dfun(x0)\fun(x0);
n=n+1;
end
x
这里,fun是原方程组,dfun是导数方程组
⑺ 非线性方程组数值解法的介绍
20世纪60年代中期以后,发展了两种求解非线性方程组(1)的新方法。一种称为区间迭代法或称区间牛顿法,它用区间变量代替点变量进行区间迭代,每迭代一步都可判断在所给区间解的存在惟一性或者是无解。这是区间迭代法的主要优点,其缺点是计算量大。另一种方法称为不动点算法或称单纯形法,它对求解域进行单纯形剖分,对剖分的顶点给一种恰当标号,并用一种有规则的搜索方法找到全标号单纯形,从而得到方程(1)的近似解。这种方法优点是,不要求f(□)的导数存在,也不用求逆,且具有大范围收敛性,缺点是计算量大
⑻ 非线性方程组总共有哪些解法
主要是数值分析法,和解析法。牛顿迭代是数值分析法,还可以用神经网络法,及改进的神经网络法。
⑼ 非线性方程组能用什么方法求解,比如牛顿法,还有什么其他方法
非线性方程,就是因变量与自变量之间的关系不是线性的关系,这类方程很多,例如平方关系、对数关系、指数关系、三角函数关系等等。求解此类方程往往很难得到精搏搏确解,经常需要求近似解问题。相应的求近似解的方法也逐渐得到大家的重视。
这些方程可分为两类,一种是多项式方程,一种是非多项式方程。基衡祥如何求解第一类多项式方拦没程,现在已经有了比较成熟的理论和方法。现在比较常用的一种数值方法是迭代法,他能够通过迭代次数的增加,而越来越接近方程的解。至于如何求解第二类非多项式方程,是现在数学领域中的一个重点研究方向。一般来说,求解此类方程是采用随机搜索的办法。
⑽ 如何用matlab解多元非线性方程组
使用solve函数。
举个例子,解非线性方程组 x^2+y^3=10 x^3-y^2=1 其中x,y为方程组的未知量 在Matlab的命名窗口中输入:
syms x y [x y]=solve('x^2+y=10','x^2-y^2=1','x','y') 即可 输出计算结果为:
x = (37^(1/2)/2 + 21/2)^(1/2) (21/2 - 37^(1/2)/2)^(1/2) -(21/2 - 1/2*37^(1/2))^(1/2) -(1/2*37^(1/2) + 21/2)^(1/2)
y = - 37^(1/2)/2 - 1/2 37^(1/2)/2 - 1/2 37^(1/2)/2 - 1/2 - 37^(1/2)/2 - 1/2
具体solve函数的使用方法,通过输入help solve来学习。