matlab程序设计实践-牛顿法解非线性方程

合集下载

matlab牛顿拉夫逊法与快速分解法的实现

matlab牛顿拉夫逊法与快速分解法的实现

一、概述MATLAB是一种强大的数学软件工具,它提供了许多优秀的数值计算和数据分析功能。

其中,牛顿拉夫逊法和快速分解法是两种常用的数值计算方法,它们在解决非线性方程组和矩阵分解等问题中具有重要的应用价值。

本文将介绍如何在MATLAB中实现这两种方法,并对它们的优缺点进行详细分析。

二、牛顿拉夫逊法的实现1. 算法原理牛顿拉夫逊法是一种用于求解非线性方程组的迭代算法。

它利用函数的一阶和二阶导数信息来不断逼近方程组的解,直到满足精度要求为止。

算法原理可以用以下公式表示:公式1其中,x表示解向量,F(x)表示方程组的函数向量,J(x)表示方程组的雅可比矩阵,δx表示解的更新量。

通过不断迭代更新x,最终得到方程组的解。

2. MATLAB代码实现在MATLAB中,可以通过编写函数来实现牛顿拉夫逊法。

以下是一个简单的示例代码:在这段代码中,首先定义了方程组的函数向量和雅可比矩阵,然后利用牛顿拉夫逊法进行迭代更新,直到满足精度要求为止。

通过这种方式,就可以在MATLAB中实现牛顿拉夫逊法,并应用于各种实际问题。

三、快速分解法的实现1. 算法原理快速分解法是一种用于矩阵分解的高效算法。

它利用矩阵的特定性质,通过分解为更小的子问题来加速计算过程。

算法原理可以用以下公式表示:公式2其中,A表示要分解的矩阵,L和U分别表示矩阵的下三角和上三角分解。

通过这种分解方式,可以将原始矩阵的计算量大大减小,提高求解效率。

2. MATLAB代码实现在MATLAB中,可以利用内置函数来实现快速分解法。

以下是一个简单的示例代码:在这段代码中,利用MATLAB内置的lu函数进行LU分解,得到矩阵的下三角和上三角分解。

通过这种方式,就可以在MATLAB中实现快速分解法,并应用于各种矩阵计算问题。

四、方法比较与分析1. 算法复杂度牛顿拉夫逊法和快速分解法在计算复杂度上有所不同。

牛顿拉夫逊法的迭代次数取决于所求解问题的非线性程度,通常需要较多的迭代次数。

matlab实现牛顿迭代法求解非线性方程组

matlab实现牛顿迭代法求解非线性方程组

matlab实现牛顿迭代法求解非线性方程组已知非线性方程组如下3*x1-cos(x2*x3)-1/2=0x1^2-81*(x2+0.1)^2+sin(x3)+1.06=0exp(-x1*x2)+20*x3+(10*pi-3)/3=0求解要求精度达到0.00001————————————————————————————————首先建立函数fun储存方程组编程如下将fun.m保存到工作路径中: function f=fun(x);%定义非线性方程组如下%变量x1 x2 x3%函数f1 f2 f3syms x1 x2 x3f1=3*x1-cos(x2*x3)-1/2;f2=x1^2-81*(x2+0.1)^2+sin(x3)+1.06;f3=exp(-x1*x2)+20*x3+(10*pi-3)/3;f=[f1 f2 f3]; ————————————————————————————————建立函数dfun用来求方程组的雅克比矩阵将dfun.m保存到工作路径中:function df=dfun(x);%用来求解方程组的雅克比矩阵储存在dfun中f=fun(x);df=[diff(f,'x1');diff(f,'x2');diff(f,'x3')];df=conj(df');————————————————————————————————编程牛顿法求解非线性方程组将newton.m保存到工作路径中:function x=newton(x0,eps,N);con=0;%其中x0为迭代初值eps为精度要求N为最大迭代步数con用来记录结果是否收敛for i=1:N;f=subs(fun(x0),{'x1' 'x2' 'x3'},{x0(1) x0(2 ) x0(3)});df=subs(dfun(x0),{'x1' 'x2' 'x3'},{x0(1) x0 (2) x0(3)});x=x0-f/df;for j=1: length(x0);il(i,j)=x(j);endif norm(x-x0)<epscon=1;break;endx0=x;end%以下是将迭代过程写入txt文档文件名为iteration.txtfid=fopen('iteration.txt','w');fprintf(fid,'iteration');for j=1:length(x0)fprintf(fid,' x%d',j);endfor j=1:ifprintf(fid,'\n%6d ',j);for k=1:length(x0)fprintf(fid,' %10.6f',il(j,k));endendif con==1fprintf(fid,'\n计算结果收敛!');endif con==0fprintf(fid,'\n迭代步数过多可能不收敛!'); endfclose(fid);————————————————————————————————运行程序在matlab中输入以下内容newton([0.1 0.1 -0.1],0.00001,20)————————————————————————————————输出结果——————————————————————————————————————————在iteration中查看迭代过程iteration x1 x2 x3.mulStablePoint用不动点迭代法求非线性方程组的一个根function [r,n]=mulStablePoint(F,x0,eps)%非线性方程组:f%初始解:a%解的精度:eps%求得的一组解:r%迭代步数:nif nargin==2eps=1.0e-6;endx0 = transpose(x0);n=1;tol=1;while tol>epsr= subs(F,findsym(F),x0);%迭代公式tol=norm(r-x0);%注意矩阵的误差求法,norm为矩阵的欧几里德范数n=n+1;x0=r;if(n>100000)%迭代步数控制disp('迭代步数太多,可能不收敛!');return;endendx0=[0 0 0];[r,n,data]=budong(x0);disp('不动点计算结果为')x1=[1 1 1];x2=[2 2 2];[x,n,data]=new_ton(x0);disp(’初始值为0,牛顿法计算结果为:’)[x,n,data]=new_ton(x1);disp('初始值为1,牛顿法计算结果为:')[x,n,data]=new_ton(x2);disp ('初始值为2,牛顿法计算结果为:')budong.mfunction[r,n,data]=budong(x0, tol)if nargin=-1tol=1e-3:x1=budong fun(x0);n=1;while(norm(x1-x0))tol)&(n500)x0=x1;x1=budong_fun(x0);n=n+1:data(:,n)=x1;endr=x1:new_ton.mfunction [x,n,data]=new_ton(x0, tol) if nargin=-1tol=1e-8;endx1=x0-budong_fun(x0)/df1(x0);n=1;while (norm(x1-x0))tol)x0=x1;x1=x0-budong_fun(x0)/df1(x0);n=n+1;data(:,n)=x1;x=x1;budong_fun.mfunction f=budong_fun(x)f(1)=3* x(1)-cos(x(2)*x(3))-1/2;f(2)=x(1)^2-81*(x(2)+0.1)^2+sin(x(3))+1.0 6;f(3)=exp(-x(1)*x(2))+20* x(3)+10* pi/3-1;f=[f(1)*f(2)*f(3)];df1.mfunction f=df1(x)f=[3sin(x(2)*x(3))*x(3) sin(x(2)*x(3))*x(2)2* x(1)-162*(x(2)+0.1)cos(x(3))exp(-x(1)*x(2))*(-x(2))exp(-x(1)*x(2))*(-x(1))20];结果:不动点计算结果为r=1.0e+012*NaN -Inf 5.6541初始值为0,牛顿法计算结果为:x=0.5000 -0.0000 -0.5236 初始值为1,牛顿法计算结果为:x=0.5000 0.0000 -0.5236 初始值为2,牛顿法计算结果为:x=0.5000 0.0000 -0.5236。

牛顿迭代法解非线性方程组(MATLAB版)

牛顿迭代法解非线性方程组(MATLAB版)

⽜顿迭代法解⾮线性⽅程组(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。

matlab实验一:非线性方程求解-牛顿法

matlab实验一:非线性方程求解-牛顿法

matlab实验一:非线性方程求解-牛顿法实验一:非线性方程求解程序1:二分法:syms f x;f=input('请输入f(x)=');A=input(’请输入根的估计范围[a,b]=’);e=input('请输入根的误差限e=’);while (A(2)—A(1))>ec=(A(1)+A(2))/2;x=A(1);f1=eval(f);x=c;f2=eval(f);if (f1*f2)〉0A(1)=c;elseA(2)=c;endendc=(A(1)+A(2))/2;fprintf(’c=%。

6f\na=%.6f\nb=%.6f\n',c,A)用二分法计算方程:1.请输入f(x)=sin(x)—x^2/2请输入根的估计范围[a,b]=[1,2]请输入根的误差限e=0。

5e-005c=1.404413a=1。

404411b=1.4044152.请输入f(x)=x^3—x-1请输入根的估计范围[a,b]=[1,1.5]请输入根的误差限e=0.5e-005c=1。

324717a=1。

324715b=1。

324718程序2:newton法:syms f x;f=input(’请输入f(x)=');df=diff(f);x0=input('请输入迭代初值x0=’);e1=input('请输入奇异判断e1=’);e2=input('请输入根的误差限e2=');N=input('请输入迭代次数限N=’);k=1;while (k〈N)x=x0;if abs(eval(f))〈e1 fprintf(’奇异!\nx=%。

6f\n迭代次数为:%d\n’,x0,k)breakelsex1=x0—eval(f)/eval(df);if abs(x1-x0)<e2fprintf('x=%。

6f\n迭代次数为:%d\n’,x1,k)breakelsex0=x1;k=k+1;endendendif k〉=Nfprintf('失败\n')end用newton法计算方程:1.请输入f(x)=x*exp(x)—1请输入迭代初值x0=0。

matlab牛顿迭代法求方程

matlab牛顿迭代法求方程

一、引言在数值计算中,求解非线性方程是一项常见的任务。

牛顿迭代法是一种常用且有效的方法,它通过不断逼近函数的零点来求解方程。

而在MATLAB中,我们可以利用其强大的数值计算功能来实现牛顿迭代法,快速求解各种非线性方程。

二、牛顿迭代法原理与公式推导1. 牛顿迭代法原理牛顿迭代法是一种利用函数的导数信息不断逼近零点的方法。

其核心思想是利用当前点的切线与x轴的交点来更新下一次迭代的值,直至逼近方程的根。

2. 公式推导与迭代过程假设要求解方程f(x)=0,在初始值x0附近进行迭代。

根据泰勒展开,对f(x)进行一阶泰勒展开可得:f(x) ≈ f(x0) + f'(x0)(x - x0)令f(x)≈0,则有:x = x0 - f(x0)/f'(x0)将x带入f(x)的表达式中,即得到下一次迭代的值x1:x1 = x0 - f(x0)/f'(x0)重复以上过程,直至达到精度要求或者迭代次数上限。

三、MATLAB中的牛顿迭代法实现1. 编写函数在MATLAB中,我们可以编写一个函数来实现牛顿迭代法。

需要定义原方程f(x)的表达式,然后计算其一阶导数f'(x)的表达式。

按照上述推导的迭代公式,编写循环语句进行迭代计算,直至满足精度要求或者达到最大迭代次数。

2. 调用函数求解方程在编写好牛顿迭代法的函数之后,可以通过在MATLAB命令窗口中调用该函数来求解具体的方程。

传入初始值、精度要求和最大迭代次数等参数,即可得到方程的近似根。

四、牛顿迭代法在工程实践中的应用1. 求解非线性方程在工程领域,很多问题都可以转化为非线性方程的求解问题,比如电路分析、控制系统设计等。

利用牛顿迭代法可以高效地求解这些复杂方程,为工程实践提供了重要的数值计算手段。

2. 优化问题的求解除了求解非线性方程外,牛顿迭代法还可以应用于优化问题的求解。

通过求解目标函数的导数等于0的方程,可以找到函数的极值点,从而解决各种优化问题。

非线性方程组求解的牛顿迭代法用MATLAB实现

非线性方程组求解的牛顿迭代法用MATLAB实现

非线性方程组求解的牛顿迭代法用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程序设计实践-牛顿法解非线性方程

matlab程序设计实践-牛顿法解非线性方程

中南大学MATLAB程序设计实践学长有爱奉献,下载填上信息即可上交,没有下载券的自行百度。

所需m文件照本文档做即可,即新建(FILE)→脚本(NEW-Sscript)→复制本文档代码→运行(会跳出保存界面,文件名默认不要修改,保存)→结果。

第一题需要把数据文本文档和m文件放在一起。

全部测试无误,放心使用。

本文档针对做牛顿法求非线性函数题目的同学,当然第一题都一样,所有人都可以用。

←记得删掉这段话班级:学号:姓名:一、《MATLAB程序设计实践》Matlab基础表示多晶体材料织构的三维取向分布函数(f=f(φ1,φ,φ2))是一个非常复杂的函数,难以精确的用解析函数表达,通常采用离散空间函数值来表示取向分布函数,是三维取向分布函数的一个实例。

由于数据量非常大,不便于分析,需要借助图形来分析。

请你编写一个matlab程序画出如下的几种图形来分析其取向分布特征:(1)用Slice函数给出其整体分布特征;"~(2)用pcolor或contour函数分别给出(φ2=0, 5, 10, 15, 20, 25, 30, 35 … 90)切面上f分布情况(需要用到subplot函数);(3) 用plot函数给出沿α取向线(φ1=0~90,φ=45,φ2=0)的f分布情况。

(备注:数据格式说明解:(1)((2)将文件内的数据按照要求读取到矩阵f(phi1,phi,phi2)中,代码如下:fid=fopen('');for i=1:18tline=fgetl(fid);endphi1=1;phi=1;phi2=1;line=0; f=zeros(19,19,19);[while ~feof(fid)tline=fgetl(fid);data=str2num(tline);line=line+1;数据说明部分,与作图无关此方向表示f随着φ1从0,5,10,15,20 …到90的变化而变化此方向表示f随着φ从0,5,10,15, 20 …到90的变化而变化表示以下数据为φ2=0的数据,即f(φ1,φ,0)if mod(line,20)==1phi2=(data/5)+1;phi=1;else~for phi1=1:19f(phi1,phi,phi2)=data(phi1);endphi=phi+1;endendfclose(fid);。

牛顿法解非线性方程(MATLAB和C++)

牛顿法解非线性方程(MATLAB和C++)

41 end
42 time = toc;
43
44 fprintf('\nIterated times is %g.\n', times);
45 fprintf('Elapsed time is %g seconds.\n', time);
46
47 root = x_iter;
48
49 % subfunction
5
6 // 功能描述:求解非线性方程根,并输出最终解 7 // 迭代式:x(k+1) = x(k) - f(x(k))/df(x(k)). 8 // 使用:修改标出的“修改”部分即可自定义参数
9
10 // 输入:函数 fun,函数导数 dfun,初值 x0,
4
11 // 最大迭代次数 maxiter,停止精度 tol 12 // 输出:迭代数值解 x_iter2
2
Listing 1: MATLAB EXAMPLE 1 % 2013/11/20 15:14:38
2
3 f = @(x)x^2 − 2; 4 df = @(x)2*x; 5 x0 = 3; 6 root = newton(f, df, x0);
C++ 以 C++ 实现的方法并未编写成为一般可调用的方法,而作为一个独立的 文件(包含一个实例),修改部分即可求解对应的方程。具体参照 cpp 文件内 注释。
A 附录
A.1 MATLAB
Listing 2: MATLAB CODE 1 function root = newton(f, df, x0, maxiter, tol) 2 %NEWTON Newton's method for nonlinear equations. 3% 4 % NEWTON's method: x(k+1) = x(k) - f(x(k))/f'(x(k)). 5% 6 % Inputs 7 % f - nonlinear equation. 8 % df - derivative of f(x). 9 % x0 - initial value. 10 % maxiter - maximum iterated times. 11 % tol - precision. 12 % 13 % Outputs 14 % root - root of f(x) = 0.
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
tol=1;
fun=diff(sym(f));%求导数
fa=subs(sym(f),findsym(sym(f)),a);
fb=subs(sym(f),findsym(sym(f)),b);
dfa=subs(sym(fun),findsym(sym(fun)),a);
dfb=subs(sym(fun),findsym(sym(fun)),b);
备注:数据格式说明
解:
(1)将文件内的数据按照要求读取到矩阵f(phi1,phi,phi2)中,代码如下:
fid=fopen('');
fori=1:18
tline=fgetl(fid);
end
phi1=1;phi=1;phi2=1;line=0;
f=zeros(19,19,19);
while~feof(fid)
tline=fgetl(fid);
data=str2num(tline);
line=line+1;
ifmod(line,20)==1
phi2=(data/5)+1;
phi=1;
else
forphi1=1:19
f(phi1,phi,phi2)=data(phi1);
end
phi=phi+1;
end
end
C=[c1+c2,-c2;-c2,c2];
%构成四阶参数矩阵
A=[zeros(2,2),eye(2);-M\K,-M\C];
%四元变量的初始条件
y0=[x0;xd0];
%设定计算点,作循环计算
for i=1:round(tf/dt)+1
t(i)=dt*(i-1);
y(:,i)=expm(A*t(i))*y0;%循环计算矩阵指数
班级:
学号:
姓名:
一、《LAB程序设计实践》Matlab基础
表示多晶体材料织构的三维取向分布函数(f=f(φ1,φ,φ2))是一个非常复杂的函数,难以精确的用解析函数表达,通常采用离散空间函数值来表示取向分布函数,是三维取向分布函数的一个实例。由于数据量非常大,不便于分析,需要借助图形来分析。请你编写一个matlab程序画出如下的几种图形来分析其取向分布特征:
root为求出的函数零点。

牛顿法的matlab程序代码如下:
functionroot=NewtonRoot(f,a,b,eps)
%牛顿法求函数f在区间[a,b]上的一个零点
%函数名:f
%区间左端点:a
%区间右端点:b
%根的精度:eps
%求出的函数零点:root
if(nargin==3)
eps=;
end
初始值可以取 和 的较大者,这样可以加快收敛速度。
和牛顿法有关的还有简化牛顿法和牛顿下山法。
在MATLAB中编程实现的牛顿法的函数为:NewtonRoot。
功能:用牛顿法求函数在某个区间上的一个零点。
调用格式:root=NewtonRoot
其中, 为函数名;
为区间左端点;
为区间右端点
eps为根的精度;
end
%按两个分图绘制x1、x2曲线
subplot(2,1,1),plot(t,y(1,:)),grid
xlabel('t'),ylabel('y');
subplot(2,1,2),plot(t,y(2,:)),grid
xlabel('t'),ylabel('y');
运行M文件,依下图所示在MATLAB命令窗口中输入数据:
f1=subs(sym(f),findsym(sym(f)),a);
f2=subs(sym(f),findsym(sym(f)),b);
if(f1==0)
root=a;
end
if(f2==0)
root=b;
end
if(f1*f2>0)
disp('两端点函数值乘积大于0 !');
return;
else
二 《MATLAB程序设计实践》科学计算(24)
班级:
学号:
姓名:
1、编程实现以下科学计算算法,并举一例应用之。(参考书籍《精通MALAB科学计算》,王正林等著,电子工业出版社,2009年)
“牛顿法非线性方程求解”
解:弦截法本质是一种割线法,它从两端向中间逐渐逼近方程的根;牛顿法本质上是一种切线法,它从一端向一个方向逼近方程的根,其递推公式为:
(2)将以下代码保存为文件:
fopen('');
readdata;
fori=1:19
subplot(5,4,i)
pcolor(f(:,:,i))
nd
运行结果如下图所示:
将以下代码保存为文件:
fopen('');
readdata;
fori=1:19
subplot(5,4,i)
contour(f(:,:,i))
即可得出该振动的两种模态
2)
解:第一步,在MATLAB命令窗口输入命令pdetool打开工具箱,调整x坐标范围为[04],y坐标范围为[03].通过options选项的Axes Linits设定如下图所示。
第二步,设定矩形区域。点击工具箱栏中的按钮“ ”,拖动鼠标画出一矩形,并双击该矩形,设定矩形大小,如下图所示。
中南大学
MATLAB程序设计实践
学长有爱奉献LE)→脚本(NEW-Sscript)→复制本文档代码→运行(会跳出保存界面,文件名默认不要修改,保存)→结果。第一题需要把数据文本文档和m文件放在一起。全部测试无误,放心使用。本文档针对做牛顿法求非线性函数题目的同学,当然第一题都一样,所有人都可以用。←记得删掉这段话
第三步,设边界条件。点击工具栏中的按钮“ ”,并双击矩形区域的相应的边线在弹出的对话框中设定边界条件。如下图所示,分别为各边框的边界条件。
第四步,设定方程。单击工具栏中的按钮“ ”,在PDE模式下选择方程类型,如下图所示,并在其中设定参数。
第五步,单击工具栏中的按钮“ ”,拆分区域为若干子区域,如下图所示。
(1)用Slice函数给出其整体分布特征;
(2)用pcolor或contour函数分别给出(φ2=0, 5, 10, 15, 20, 25, 30, 35 … 90)切面上f分布情况(需要用到subplot函数);
(3) 用plot函数给出沿α取向线(φ1=0~90,φ=45,φ2=0)的f分布情况。
k1=input('k1=');k2=input('k2='); %刚度
%输入阻尼系数
c1=input('c1=');c2=input('c2=');
%给出初始条件及时间向量
x0=[1;0];
xd0=[0;-1];
tf=50; %步数
dt=; %步长
%构成二阶参数矩阵
M=[m1,0;0,m2];
K=[k1+k2,-k2;-k2,k2];
(3)由上述的解耦模态中,给出初始条件 , ,化为 , ,即可求出其分量 , 。
设位置和速度的初始条件分别为 , ,则这三个步 骤得到的最后公式为
系统解耦的振动模态的MATLAB代码如下:
function erziyoudu()
%输入各原始参数
m1=input('m1=');m2=input('m2='); %质量
end
运行结果如下图所示:
(3)φ1=0~90,φ=45,φ2=0所对应的f(φ1,φ,φ2)即为f(:,10,1)。将以下代码保存为文件:
fopen('');
readdata;
plot([0:5:90],f(:,10,1),'-bo')
text(60,6,'\phi=45 \phi2=0')
运行结果如下图所示:
root=r1-fx/dfx;%迭代的核心公式
tol=abs(root-r1);
end
end
例:求方程3x^2-exp(x)=0的一根
解:在MATLAB命令窗口输入:
>> r=NewtonRoot('3*x^2-exp(x)',3,4)
输出结果:
X=
流程图:
2、编程解决以下科学计算问题。
1)
解:这个方程可用下列步骤来解
fclose(fid);
将以上代码保存为在MATLAB中运行,运行结果如下图所示:
将以下代码保存为文件:
fopen('');
readdata;
[x,y,z]=meshgrid(0:5:90,0:5:90,0:5:90);
slice(x,y,z,f,[45,90],[45,90],[0,45])
运行结果如下图所示:
if(dfa>dfb)%初始值取两端点导数较大者
root=a-fa/dfa;
else
root=b-fb/dfb;
end
while(tol>eps)
r1=root;
fx=subs(sym(f),findsym(sym(f)),r1);
dfx=subs(sym(fun),findsym(sym(fun)),r1);%求该点的导数值
(1)用eig函数求出矩阵K-λM的特征值L和特征向量U,U和L满足
(2)在原始方程Mx+Kx=0两端各乘以 及在中间乘以对角矩阵 *U,得
*M* *U* + *K* *x=0
作变量置换 ,得
这是一个对角矩阵方程,即可把它分两个方程:
相关文档
最新文档