matlab求解非线性方程组迭代的算例
- 格式:doc
- 大小:187.50 KB
- 文档页数:4
matlab fsolve 算法Matlab是一种常用的科学计算软件,其中的fsolve算法是用于求解非线性方程组的一种方法。
本文将介绍fsolve算法的原理和使用方法,并通过实例展示其在实际问题中的应用。
一、fsolve算法原理fsolve算法是一种数值方法,用于求解非线性方程组。
它基于牛顿迭代法,通过不断迭代逼近方程组的解。
具体原理如下:1. 假设要求解的方程组为F(x) = 0,其中x为未知向量,F为非线性函数。
2. 首先,我们需要对方程组进行线性化,即将其转化为形如J(x)Δx = -F(x)的线性方程组,其中J(x)为方程组F(x)的雅可比矩阵,Δx为x的增量。
3. 初始时,我们给定一个初始解x0。
4. 然后,利用初始解和雅可比矩阵,通过求解线性方程组J(x0)Δx = -F(x0),得到增量Δx。
5. 将增量Δx加到初始解x0上,得到新的解x1 = x0 + Δx。
6. 重复步骤4和步骤5,直到满足终止准则,即F(x)的范数小于某个给定的容差。
二、fsolve算法使用方法在Matlab中,可以使用fsolve函数调用fsolve算法来求解非线性方程组。
其基本语法如下:x = fsolve(fun,x0,options)其中,fun为一个函数句柄,表示要求解的方程组F(x) = 0,x0为初始解向量,options为求解选项。
三、fsolve算法应用实例下面通过一个实际问题来演示fsolve算法的应用。
假设有一个非线性方程组:sin(x) + cos(y) = 1exp(x) + y = 2我们的任务是求解方程组的解。
我们需要将方程组转化为函数形式。
在Matlab中,我们可以定义一个函数文件,例如:function F = equations(x)F(1) = sin(x(1)) + cos(x(2)) - 1;F(2) = exp(x(1)) + x(2) - 2;然后,我们可以使用fsolve函数来求解方程组:x0 = [0,0]; % 初始解向量options = optimoptions('fsolve','Display','iter'); % 设置求解选项x = fsolve(@equations,x0,options); % 调用fsolve算法求解方程组我们可以将求解的结果打印出来:disp(['x = ', num2str(x(1))]);disp(['y = ', num2str(x(2))]);通过运行上述代码,我们可以得到方程组的解x = 0.7854,y = 1.2146。
⽜顿迭代法解⾮线性⽅程组(MATLAB版)⽜顿迭代法,⼜名切线法,这⾥不详细介绍,简单说明每⼀次⽜顿迭代的运算:⾸先将各个⽅程式在⼀个根的估计值处线性化(泰勒展开式忽略⾼阶余项),然后求解线性化后的⽅程组,最后再更新根的估计值。
下⾯以求解最简单的⾮线性⼆元⽅程组为例(平⾯⼆维定位最基本原理),贴出源代码:1、新建函数fun.m,定义⽅程组1 function f=fun(x);2 %定义⾮线性⽅程组如下3 %变量x1 x24 %函数f1 f25 syms x1 x26 f1 = sqrt((x1-4)^2 + x2^2)-sqrt(17);7 f2 = sqrt(x1^2 + (x2-4)^2)-5;8 f=[f1 f2];2、新建dfun.m,求出⼀阶微分⽅程1 function df=dfun(x);2 f=fun(x);3 df=[diff(f,'x1');diff(f,'x2')]; %雅克⽐矩阵3、建⽴newton.m,执⾏⽜顿迭代过程1 clear;clc2 format;3 x0=[0 0]; % 迭代初始值4 eps = 0.00001; % 定位精度要求5for i = 1:106 f = double(subs(fun(x0),{'x1''x2'},{x0(1) x0(2)}));7 df = double(subs(dfun(x0),{'x1''x2'},{x0(1) x0(2)})); % 得到雅克⽐矩阵8 x = x0 - f/df;9if(abs(x-x0) < eps)10break;11 end12 x0 = x; % 更新迭代结果13 end14 disp('定位坐标:');15 x16 disp('迭代次数:');17 i结果如下:定位坐标:x =0.0000 -1.0000迭代次数:i =4。
x=e^x用简单迭代法matlab篇一:正文:简单迭代法是一种用于求解非线性方程的迭代方法,它的基本思想是通过不断迭代逼近方程的解。
我们将使用简单迭代法来解决方程x=e^x,并使用MATLAB 编写代码实现。
首先,我们需要将方程进行转化,使得等式左右两边的差值为零。
针对本题,我们可以将方程改写为x - e^x = 0。
接下来,我们可以通过迭代的方式逐步逼近方程的解。
假设初始值为x0,则迭代公式可以表示为x(i+1) = x(i) - f(x(i)) / f'(x(i)),其中f(x)为方程的左边项,f'(x)为f(x)的导数。
在MATLAB中,我们可以使用循环结构来实现迭代过程。
具体代码如下所示: ```% 初始值x0 = 0.5;% 迭代次数iterations = 100;% 容差tolerance = 1e-6;% 迭代过程for i = 1:iterations% 计算方程的左边项和导数f = x0 - exp(x0);f_prime = 1 - exp(x0);% 更新x的值x = x0 - f / f_prime;% 判断是否满足容差要求if abs(x - x0) < tolerancebreak;end% 更新x0的值x0 = x;end% 输出结果fprintf('方程的解为: %f', x);```在上述代码中,我们设置了初始值x0为0.5,迭代次数为100,容差为1e-6。
通过不断迭代,直到满足容差要求或达到最大迭代次数时停止迭代。
最终输出的结果即为方程的解。
通过运行以上代码,我们可以得到方程x=e^x的解为x=0.567143。
篇二:我们可以使用简单迭代法来解决方程x=e^x。
简单迭代法是一种通过不断迭代逼近解的方法。
首先,我们可以将方程x=e^x转化为x-e^x=0的形式。
然后,我们可以通过构造迭代函数来逼近方程的解。
假设迭代函数为g(x),我们可以选择将g(x)设置为x-e^x,即g(x) = x - e^x。
第7章 求解非线性方程7.1 多项式运算在MATLAB 中的实现一、多项式的表达n 次多项式表达为:n a +⋯⋯++=x a x a x a p(x )1-n 1-n 1n 0,是n+1项之和在MATLAB 中,n 次多项式可以用n 次多项式系数构成的长度为n+1的行向量表示[a0, a1,……an-1,an]二、多项式的加减运算设有两个多项式n a +⋯⋯++=x a x a x a p1(x )1-n 1-n 1n 0和m b +⋯⋯++=x b x b x b p2(x )1-m 1-m 1m 0。
它们的加减运算实际上就是它们的对应系数的加减运算。
当它们的次数相同时,可以直接对多项式的系数向量进行加减运算。
当它们的次数不同时,应该把次数低的多项式无高次项部分用0系数表示。
例2 计算()()1635223-+++-x x x xa=[1, -2, 5, 3]; b=[0, 0, 6, -1]; c=a+b例 3 设()6572532345++-+-=x x x x x x f ,()3532-+=x x x g ,求f(x)+g(x)f=[3, -5, 2, -7, 5, 6]; g=[3, 5, -3]; g1=[0, 0, 0, g];%为了和f 的次数找齐 f+g1, f-g1三、多项式的乘法运算conv(p1,p2)例4 在上例中,求f(x)*g(x)f=[3, -5, 2, -7, 5, 6]; g=[3, 5, -3];conv(f, g)四、多项式的除法运算[Q, r]=deconv(p1, p2)表示p1除以p2,给出商式Q(x),余式r(x)。
Q,和r 仍为多项式系数向量 例4 在上例中,求f(x)/g(x)f=[3, -5, 2, -7, 5, 6]; g=[3, 5, -3];[Q, r]=deconv(f, g)五、多项式的导函数p=polyder(P):求多项式P 的导函数p=polyder(P ,Q):求P ·Q 的导函数[p,q]=polyder(P ,Q):求P/Q 的导函数,导函数的分子存入p ,分母存入q 。
非线性方程组求解的牛顿迭代法用MATLAB实现首先,我们需要定义非线性方程组。
假设我们要求解方程组:```f1(x1,x2)=0f2(x1,x2)=0```其中,`x1`和`x2`是未知数,`f1`和`f2`是非线性函数。
我们可以将这个方程组表示为向量的形式:```F(x)=[f1(x1,x2);f2(x1,x2)]=[0;0]```其中,`F(x)`是一个列向量。
为了实现牛顿迭代法,我们需要计算方程组的雅可比矩阵。
雅可比矩阵是由方程组的偏导数组成的矩阵。
对于方程组中的每个函数,我们可以计算其对每个变量的偏导数,然后将这些偏导数组成一个矩阵。
在MATLAB中,我们可以使用`jacobi`函数来计算雅可比矩阵。
以下是一个示例函数的定义:```matlabfunction J = jacobi(x)x1=x(1);x2=x(2);J = [df1_dx1, df1_dx2; df2_dx1, df2_dx2];end```其中,`x`是一个包含未知数的向量,`df1_dx1`和`df1_dx2`是`f1`对`x1`和`x2`的偏导数,`df2_dx1`和`df2_dx2`是`f2`对`x1`和`x2`的偏导数。
下一步是实现牛顿迭代法。
牛顿迭代法的迭代公式为:```x(k+1)=x(k)-J(x(k))\F(x(k))```其中,`x(k)`是第`k`次迭代的近似解,`\`表示矩阵的求逆操作。
在MATLAB中,我们可以使用如下代码来实现牛顿迭代法:```matlabfunction x = newton_method(x_initial)max_iter = 100; % 最大迭代次数tol = 1e-6; % 收敛阈值x = x_initial; % 初始解for k = 1:max_iterF=[f1(x(1),x(2));f2(x(1),x(2))];%计算F(x)J = jacobi(x); % 计算雅可比矩阵 J(x)delta_x = J \ -F; % 计算增量 delta_xx = x + delta_x; % 更新 xif norm(delta_x) < tolbreak; % 达到收敛条件,停止迭代endendend```其中,`x_initial`是初始解的向量,`max_iter`是最大迭代次数,`tol`是收敛阈值。
⽤Matlab编写⼆分法和Newton迭代法求解⾮线性函数1、⼆分法原理:若f的值在C[a, b]中,且f (a) · f (b) < 0,则f在 (a, b) 上必有⼀根。
实现算法流程:2、Newton迭代法迭代公式:⼏何意义:3、求解问题⽤Newton法和⼆分法求的解。
4、代码实现1 clear;close;clc2 a=0;b=1;%根区间3 e=10^(-6);%根的容许误差4 [X , N]=dichotomy(e,a,b);%⼆分法5 p0=0.5;%初始值6 N=15;%迭代次数7 [X1]=Newdon(p0,e,N);%Newton迭代法89 function [X , N]=dichotomy(deta,a,b)10 % 函数dichotomy:⼆分法11 %输⼊值:12 %fun:⽅程函数13 %deta:根的容许误差14 %有根区间:[a,b]15 %输出值16 %X:求解到的⽅程的根17 %N:总的迭代次数18 N=1+fix(log2((b-a)/deta));%由公式7.2求得,取整数|X_N-X*|<=(b-a)/2^N<deta,求N19 n=1;20 f1=myfunction(a);21 f2=myfunction(b);22if (f1*f2>0)23 disp('根不在输⼊的区间⾥,请重新输⼊区间');24else25while n <= N26 x=(a+b)/2;27if myfunction(a)*myfunction(x)>028 a=x;29else30 b=x;31 end32 n=n+1;33 end34 X=x;35 fprintf('第%d次⼆分法求出的⽅程的根:\n',N);36 fprintf('X=\n');37 disp(X);38 end39 end4041 function [P]=Newdon(p0,TOL,N)42 %求⽅程组的解43 %输⼊参数44 %初始值:p045 %误差容限:TOL46 %最⼤迭代次数:N47 %输出参数:48 %⽅程近似解:p49 %或失败信息“Method failed”50 format long;51 n=1;%初始迭代次数52 syms x;53while n<=N54if abs(subs(diff(myfunction(x)),x,p0))<TOL55 P=p0;56break;57else58if subs(diff(myfunction(x),2),x,p0)==059 disp('Method failed');60break;61else62 p=p0-myfunction(p0)/subs(diff(myfunction(x)),x,p0);63 p=eval(p);%将exp的值转为⼩数值64if(abs(p-p0)<TOL)65 P=p;66break;67else68 p0=p;69 end70 end71 end72 n=n+1;73 end74 % P=vpa(P,10);%将分数转为⼩数并保留8位⼩数75 fprintf('第%d次NeWton迭代法求出的⽅程的根:\n',N);76 fprintf('P=\n');77 disp(P);78 end7980 function f=myfunction(x)81 f=x*exp(x)-1;82 end5、求解结果。
数学实验报告Matlab的简单应用——非线性方程(组)求解姓名班级学号学院2013年5月12日一、实验目的1.熟悉MATLAB软件中非线性方程(组)的求解命令及其用法。
2.掌握求非线性方程近似根的常用数值方法——迭代法。
3.了解分叉与混沌概念。
二、实验问题1.利用弦截法编程对方程x^5+x-1=0进行求解实验,并与二分法、牛顿切线法进行比较;2.方程f(x)=x^2+x-4=0在(0,4)内有唯一的实根,现构造以下三种迭代函数:(1)g1(x)=4-x^2,迭代初值x0=4;(2)g2(x)=4/(1+x),迭代初值x0=4;(3)g3(x)=x-(x^2+x-4)/(2x+1),迭代初值x0=4;分别用给出的3种迭代函数构造迭代数列x(k+1)=g1(x(k)),i=1,2,3,观察这些迭代数列是否收敛,若收敛能否收敛到方程f(x)=0的解。
除此之外,你还能构造出其他收敛的迭代吗?4.分别取不同的参数值r,做迭代数列x(n+1)=rx(n)(1-x(n)),n=0,1,2……,观察分叉与混沌现象。
步骤1:首先,分别取参数r为0,0.3,0.6,0.9,1.2,1.5,1.8,2.1,2.4,2.7, 3.0,3.3,3.6,3.9等14个值,按迭代序列迭代150步,分别产生14个迭代序列{x(k)},k=0,1,…,150;其次,分别取这14个迭代序列的后50个迭代值(x100,x101,…,x150),画在以r为横坐标的同一坐标面rox上,每一个r取值对应的迭代值点为一列。
步骤2:对(1)中图进行观察分析,容易发现:(1)当r为0,0.3,0.6,0.9,1.2,1.5,1.8,2.1,2.4,2.7时,每个r对应的50个迭代值凝聚在一点,这说明对这些r的取值所产生的迭代序列是收敛的。
(2)当r为3,3.3时,r对应的50个迭代值凝聚在两个点,这说明这些r值所对应的迭代序列不收敛,但凝聚在两个点附近;同时也说明当r在2.7和3之间取值时,对应的迭代序列从收敛到不收敛,轨道由一只分为两支开始出现分叉现象。
解:设Na t =,Jh x =,原地基梁根据差分方法可以化为Nn Jj na na w w w w w w J w w w a n j n j n j n j n j n j n j n j n j ,...,0,...,0)5sin()sin(1)464()2(13,3,2,1,,1,2441,,1,2===++-+-++---++-+πππ将其变形为Nn Jj J a m na na a w w w w mw w m w a w n j n j n j n j n j n j n j n j ,...,0,...,0)5sin()sin()4)26(4(44221,,2,1,,1,23,321,===+-+--+---=---+++πππ可将其写为1][+n j w =n j w a ][332π-n j w S m ]][[-1][--n j w ])[5sin()sin(2E na na a π+ N n J j ,...,0,...,0==又利用边界条件,可得nn nJ n J n J nJ n J n J n J w w w w w w w w w ,1,1,1,,1,2,1,,2244=-=+-=--+--+而 J j J j w j ,...,0);/sin(0,==π利用以上方程便可代入进行迭代运算。
以下是matlab 程序:J=input('请输入J 值:');N=input('请输入N 值:');t=input('请输入t 值:');a=t/N;m=a^2*J^4/pi^4;S=zeros(J,J);S(1,1:3)=[7-2/m,-4,1];S(2,1:4)=[-4,6-2/m,-4,1];for i=1:J-4S(i+2,i:i+4)=[1,-4,6-2/m,-4,1];endS(J-1,J-3:J)=[1,-4,5-2/m,-2];S(J,J-2:J)=[2,-4,2-2/m];E=zeros(J,1);E(:,1)=1;W=zeros(J,N+2);for j=1:JW(j,1)=sin(pi*j/J);endW(:,2)=0.5*((-a^2/pi^3)*(W(:,1).^3)-m*S*W(:,1));for n=3:N+2W(:,n)=(-a^2/pi^3)*(W(:,n-1).^3)-m*S*W(:,n-2)-W(:,n-2)+(a^2)*sin(n*a)*sin(5*pi*n*a)*E;end根据差分格式的收敛性讨论可知,当2102≤<N t J 时,差分格式能够收敛。
解:
设Na t =,Jh x =,原地基梁根据差分方法可以化为
N
n J
j na na w w w w w w J w w w a n j n j n j n j n j n j n j n j n j ,...,0,...,0)5sin()sin(1)464()2(13,3
,2,1,,1,2441,,1,2===++-+-++---++-+πππ将其变形为
N
n J
j J a m na na a w w w w m
w w m w a w n j n j n j n j n j n j n j n j ,...,0,...,0)5sin()sin()4)26(4(44
221,,2,1,,1,23,321,===+-+--+---=---+++π
ππ
可将其写为
1][+n j w =n j w a ][3
32
π-n j w S m ]][[-1][--n j w ])[5sin()sin(2E na na a π+ N n J j ,...,0,...,0==
又利用边界条件,可得
n
n n
J n J n J n
J n J n J n J w w w w w w w w w ,1,1,1,,1,2,1,,2244=-=+-=--+--+
而 J j J j w j ,...,0);/sin(0,==π
利用以上方程便可代入进行迭代运算。
以下是matlab 程序:
J=input('请输入J 值:');
N=input('请输入N 值:');
t=input('请输入t 值:');
a=t/N;
m=a^2*J^4/pi^4;
S=zeros(J,J);
S(1,1:3)=[7-2/m,-4,1];
S(2,1:4)=[-4,6-2/m,-4,1];
for i=1:J-4
S(i+2,i:i+4)=[1,-4,6-2/m,-4,1];
end
S(J-1,J-3:J)=[1,-4,5-2/m,-2];
S(J,J-2:J)=[2,-4,2-2/m];
E=zeros(J,1);
E(:,1)=1;
W=zeros(J,N+2);
for j=1:J
W(j,1)=sin(pi*j/J);
end
W(:,2)=0.5*((-a^2/pi^3)*(W(:,1).^3)-m*S*W(:,1));
for n=3:N+2
W(:,n)=(-a^2/pi^3)*(W(:,n-1).^3)-m*S*W(:,n-2)-W(:,n-2)+(a^2)*sin(n*a)*sin(5*pi*n*a)*E;
end
根据差分格式的收敛性讨论可知,当2
102≤<N t J 时,差分格式能够收敛。
这为我们取J 、N 、t 值提供了依据。
我们分以下三种情况,都在t=3时进行比较。
1、J=10,N=5000,t=5.
2、J=15,N=5000,t=5.
3、J=20,N=5000,t=5.
上图中红线代表情形1,绿线代表情形2,蓝线代表情形3 我们跟踪情形3的中点5秒内运动情况,可得
如果2
12 N t J ,经检验。
计算结果不收敛。