数值分析的MATLAB程序
- 格式:doc
- 大小:45.50 KB
- 文档页数:7
数值分析编程作业2012年12月第二章14.考虑梯形电阻电路的设计,电路如下:电路中的各个电流{i1,i2,…,i8}须满足下列线性方程组:121232343454565676787822/252025202520252025202520250i i V R i i i i i i i i i i i i i i i i i i i i -=-+-=-+-=-+-=-+-=-+-=-+-=-+=这是一个三对角方程组。
设V=220V ,R=27Ω,运用追赶法,求各段电路的电流量。
Matlab 程序如下:function chase () %追赶法求梯形电路中各段的电流量 a=input('请输入下主对角线向量a='); b=input('请输入主对角线向量b='); c=input('请输入上主对角线向量c='); d=input('请输入右端向量d='); n=input('请输入系数矩阵维数n='); u(1)=b(1); for i=2:nl(i)=a(i)/u(i-1); u(i)=b(i)-c(i-1)*l(i); endy(1)=d(1); for i=2:ny(i)=d(i)-l(i)*y(i-1); endx(n)=y(n)/u(n); i=n-1; while i>0x(i)=(y(i)-c(i)*x(i+1))/u(i); i=i-1;end x输入如下: >> chase请输入下主对角线向量a=[0,-2,-2,-2,-2,-2,-2,-2]; 请输入主对角线向量b=[2,5,5,5,5,5,5,5];请输入上主对角线向量c=[-2,-2,-2,-2,-2,-2,-2,0]; 请输入方程组右端向量d=[220/27,0,0,0,0,0,0,0]; 请输入系数矩阵阶数n=8 运行结果如下:x = 8.1478 4.0737 2.0365 1.0175 0.5073 0.2506 0.1194 0.0477第三章14.试分别用(1)Jacobi 迭代法;(2)Gauss-Seidel 迭代法解线性方程组1234510123412191232721735143231211743511512x x x x x ⎡⎤⎡⎤⎡⎤⎢⎥⎢⎥⎢⎥---⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥=--⎢⎥⎢⎥⎢⎥--⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥---⎣⎦⎣⎦⎣⎦ 迭代初始向量(0)(0,0,0,0,0)T x =。
数值分析中求解非线性方程的MATLAB求解程序1. fzero函数:fzero函数是MATLAB中最常用的求解非线性方程的函数之一、它使用了割线法、二分法和反复均值法等多种迭代算法来求解方程。
使用fzero函数可以很方便地求解单变量非线性方程和非线性方程组。
例如,要求解方程f(x) = 0,可以使用以下语法:``````2. fsolve函数:fsolve函数是MATLAB中求解多维非线性方程组的函数。
它是基于牛顿法的迭代算法来求解方程组。
使用fsolve函数可以非常方便地求解非线性方程组。
例如,要求解方程组F(x) = 0,可以使用以下语法:``````3. root函数:root函数是MATLAB中求解非线性方程组的函数之一、它采用牛顿法或拟牛顿法来求解方程组。
使用root函数可以非常方便地求解非线性方程组。
例如,要求解方程组F(x) = 0,可以使用以下语法:``````4. vpasolve函数:vpasolve函数是MATLAB中求解符号方程的函数。
它使用符号计算的方法来求解方程,可以得到精确的解。
vpasolve函数可以求解多变量非线性方程组和含有符号参数的非线性方程。
例如,要求解方程组F(x) = 0,可以使用以下语法:```x = vpasolve(F(x) == 0, x)```vpasolve函数会返回方程组的一个精确解x。
5. fsolve和lsqnonlin结合:在MATLAB中,可以将求解非线性方程转化为求解最小二乘问题的形式。
可以使用fsolve函数或lsqnonlin函数来求解最小二乘问题。
例如,要求解方程f(x) = 0,可以将其转化为最小二乘问题g(x) = min,然后使用fsolve或lsqnonlin函数来求解。
具体使用方法可以参考MATLAB官方文档。
6. Newton-Raphson法手动实现:除了使用MATLAB中的函数来求解非线性方程,还可以手动实现Newton-Raphson法来求解。
数值分析———Matlab上机作业学院:班级:老师:姓名:学号:第二章解线性方程组的直接解法第14题【解】1、编写一个追赶法的函数输入a,b,c,d输出结果x,均为数组形式function x=Zhuiganfa(a,b,c,d)%首先说明:追赶法是适用于三对角矩阵的线性方程组求解的方法,并不适用于其他类型矩阵。
%定义三对角矩阵A的各组成单元。
方程为Ax=d%b为A的对角线元素(1~n),a为-1对角线元素(2~n),c为+1对角线元素(1~n-1)。
% A=[2 -1 0 0% -1 3 -2 0% 0 -2 4 -3% 0 0 -3 5]% a=[-1 -2 -3];c=[-1 -2 -3];b=[2 3 4 5];d=[6 1 -2 1];n=length(b);u(1)=b(1);y(1)=d(1);for i=2:nl(i)=a(i-1)/u(i-1);%先求l(i)u(i)=b(i)-c(i-1)*l(i);%再求u(i)%A=LU,Ax=LUx=d,y=Ux,%Ly=d,由于L是下三角矩阵,对角线均为1,所以可求y(i)y(i)=d(i)-l(i)*y(i-1);endx(n)=y(n)/u(n);for i=(n-1):-1:1%Ux=y,由于U是上三角矩阵,所以可求x(i)x(i)=(y(i)-c(i)*x(i+1))/u(i);end2、输入已知参数>>a=[2 2 2 2 2 2 2];>>b=[2 5 5 5 5 5 5 5];>>c=[2 2 2 2 2 2 2];>>d=[220/27 0 0 0 0 0 0 0];3、按定义格式调用函数>>x=zhuiganfa(a,b,c,d)4、输出结果x=[8.147775166909105 -4.073701092835030 2.036477565178471 -1.017492820111148 0.507254485099400 -0.250643392637350 0.119353996493976 -0.047741598597591]第15题【解】1、编写一个程序生成题目条件生成线性方程组A x=b 的系数矩阵A 和右端项量b ,分别定义矩阵A 、B 、a 、b 分别表示系数矩阵,其中1(10.1;,1,2,...,)j ij i i a x x i i j n -==+=或1(,1,2,...,)1ij a i j n i j ==+-分别构成A 、B 对应右端项量分别a 、b 。
数值分析MATLAB编程——数值积分法1、调用函数--f.Mfunction y=f(x)%------------------------------------------------------------函数1 y=sqrt(4-sin(x)*sin(x));%------------------------------------------------------------函数2 %y=sin(x)/x;%if x==0% y=0;%end%------------------------------------------------------------函数3 %y=exp(x)/(4+x*x);%------------------------------------------------------------函数4 %y=(log(1+x))/(1+x*x);2、复合梯形公式--tixing.M%复合梯形公式clear alla=input('请输入积分下限:');b=input('请输入积分上限:');n=input('区间n等分:');h=(b-a)/n;x=a:h:b;T=0;for k=1:n;T=0.5*h*(f(x(k))+f(x(k+1)))+T;endT=vpa(T,8)3、复合Simpson公式--simpson.M%复合Simpson公式clear alla=input('请输入积分下限:');b=input('请输入积分上限:');n=input('区间n等分:');h=(b-a)/n;x=a:h:b;S=0;for k=1:n;xx=(x(k)+x(k+1))/2;S=(1/6)*h*(f(x(k))+4*f(xx)+f(x(k+1)))+S;endS=vpa(S,8)4、Romberg算法--romberg.M%Romberg算法clear alla=input('请输入积分下限:');b=input('请输入积分上限:');n=input('区间n等分:');num=0:n;R=[num'];h=b-a;T=h*(f(a)+f(b))/2;t(1)=T;for i=2:n+1;u=h/2;H=0;x=a+u;while x<b;H=H+f(x);x=x+h;endt(i)=(T+h*H)/2;T=t(i);h=u;endR=[R,t'];for i=2:n+1for j=n+1:-1:1if j>=it(j)=(4^(i-1)*t(j)-t(j-1))/(4^(i-1)-1);elset(j)=0;endendR=[R,t'];endR=vpa(R,8)R(n,n)5、变步长算法(以复化梯形公式为例)--tixing2.M%复合梯形公式,确定最佳步长format longclear alla=input('请输入积分下限:');b=input('请输入积分上限:');eps=input('请输入误差:');k=1;T1=(b-a)*(f(a)+f(b))/2;T2=(T1+(b-a)*(f((a+b)/2)))/2; while abs((T1-T2)/3)>=epsM=0;n=2^k;h=(b-a)/n;T1=T2;x=a:h:b;for i=1:n;xx=(x(i)+x(i+1))/2;M=M+f(xx);endT2=(T1+h*M)/2;k=k+1;endT=vpa(T2,8)n=2^k。
牛顿插值法是一种常用的数值分析方法,用于构造一个多项式函数,以便在给定的数据点上进行插值。
这个主题在数学和工程领域中有着广泛的应用,特别是在数据拟合和函数逼近方面。
牛顿插值法的核心思想是通过不断地添加新的数据点来构造一个多项式,并利用已知数据点来确定多项式的系数,从而实现对未知数据点的插值预测。
在Matlab中,实现牛顿插值法并不困难,我们可以利用已有的函数和工具来简化计算过程。
下面,我们将通过一个具体的例题来讲解如何使用Matlab编写牛顿插值法的程序,并分析其结果。
我们需要明确牛顿插值法的数学原理。
给定n个互不相同的节点\(x_0, x_1, ... , x_n\),以及在这些节点上的函数值\(f(x_0), f(x_1), ... , f(x_n)\),我们希望构造一个n次插值多项式p(x),满足p(x_i) = f(x_i),i=0,1,...,n。
牛顿插值多项式的一般形式为:\[p(x) = a_0 + a_1(x - x_0) + a_2(x - x_0)(x - x_1) + ... + a_n(x -x_0)(x - x_1)...(x - x_{n-1})\]其中,\[a_i\]表示插值多项式的系数。
通过牛顿插值法的迭代过程,可以逐步求解出这些系数,进而得到插值多项式的表达式。
接下来,我们将以一个具体的例题来演示如何在Matlab中实现牛顿插值法。
假设我们有如下的数据点和函数值:\(x = [1, 2, 3, 4]\)\(f(x) = [1, 4, 9, 16]\)我们希望利用这些数据点来构造一个插值多项式,并在给定的区间上进行插值计算。
在Matlab中,可以通过interp1函数来进行插值计算,该函数支持多种插值方法,包括牛顿插值法。
下面是一个简单的Matlab程序示例:```matlabx = [1, 2, 3, 4];y = [1, 4, 9, 16];xi = 2.5;yi = interp1(x, y, xi, 'spline');disp(['在x=',num2str(xi),'处的插值结果为:',num2str(yi)]);```在这段代码中,我们首先定义了给定的数据点x和对应的函数值y,然后利用interp1函数对x=2.5处的插值结果进行计算。
课程设计课程名称:数值分析设计题目:学号:姓名:完成时间:2014.11.18题目一: 解线性方程组的直接法 设方程组Ax b =,其中250002511125555111x x x x x x A x x x ⎡⎤⎢⎥⎢⎥=⎢⎥⎢⎥⎢⎥⎣⎦, 矩阵中10.1(0,1,,5)k x k k =+=,b 由相应的矩阵元素计算,使解向量(1,1,,1)T x =。
(1) A 不变,对b 的元素6b 加一个扰动410-,求解方程组;(2) b 不变,对A 的元素22a 和66a 分别加一个扰动610-,求解方程组; (3) 对上述两种扰动方程组的解做误差分析。
一.数学原理:本计算采用直接法中的列主元高斯消元法,高斯列主元消元法原理如下: 1、设有n 元线性方程组如下:1111n n nn a a a a ⎛⎫ ⎪ ⎪ ⎪⎝⎭1nx x ⎛⎫ ⎪ ⎪ ⎪⎝⎭=1nb b ⎛⎫ ⎪ ⎪ ⎪⎝⎭2、第一步:如果a11!=0, 令l i1= ai1/a11, I= 2,3,……,n用(-li1)乘第一个方程加到第i 个方程上,得同解方程组:a (1)11 a (1)12 . . . a (1)1nx 1 b (1)1 a (1)21 a (1)22 . . . a (1)2n x 2 b (1)2 . . . . . . . = . a (1)n-11 a (1)n-12 . . a (1)n-1n x n-1 b (1)n-1 a (1)n1 a (1)n2 . . . a (1)nn x n b (1)n简记为:A (2) x = b (2) 其中a (2)ij = a (1)ij – l i1 * a (1)1j , I ,j = 2,3,..,nb (2)I = b (1)I – l i1 * b (1)1 , I = 2,3,...,n 第二步:如果a (2)22 != 0,令l i2= a (2)i2/a (2)22, I= 3,……,n依据同样的原理,对矩阵进行化间(省略),依次下去,直到完成!最后,得到上三角方程组:a(1)11 a(1)12. . . a(1)1nx1b(1)10 a(1)22 . . . a(1)2nx2b(1)2. . . . . . . = .0 0 . . a(n-1)n-1n xn-1b(n-1)n-10 0 . . . a(n)nn xnb(n)n简记为:A(n) x = b(n)最后从方程组的最后一个方程进行回代求解为:Xn = b(n) / a(n)nnXi = ( b(k)k- ∑ a(k)kj x j ) / a(k)kk二.解题过程:1.由题中所给条件可求出b。
列主元法
function lianzhuyuan(A,b)
n=input('请输入n:') %选择阶数A=zeros(n,n); %系数矩阵A
b=zeros(n,1); %矩阵b
X=zeros(n,1); %解X
for i=1:n
for j=1:n
A(i,j)=(1/(i+j-1)); %生成hilbert矩阵A
end
b(i,1)=sum(A(i,:)); %生成矩阵b
end
for i=1:n-1
j=i;
top=max(abs(A(i:n,j))); %列主元
k=j;
while abs(A(k,j))~=top %列主元所在行
k=k+1;
end
for z=1:n %交换主元所在行a1=A(i,z);
A(i,z)=A(k,z);
A(k,z)=a1;
end
a2=b(i,1);
b(i,1)=b(k,1);
b(k,1)=a2;
for s=i+1:n %消去算法开始m=A(s,j)/A(i,j); %化简为上三角矩阵
A(s,j)=0;
for p=i+1:n
A(s,p)=A(s,p)-m*A(i,p);
end
b(s,1)=b(s,1)-m*b(i,1);
end
end
X(n,1)=b(n,1)/A(n,n); %回代开始
for i=n-1:-1:1
s=0; %初始化s
for j=i+1:n
s=s+A(i,j)*X(j,1);
end
X(i,1)=(b(i,1)-s)/A(i,i);
end
X
欧拉法
clc
clear
% 欧拉法
p=10; %贝塔的取值
T=10; %t取值的上限
y1=1; %y1的初值
r1=1; %y2的初值
%输入步长h的值
h=input('欧拉法please input number(h=1 0.5 0.25 0.125 0.0625):h=') ; if h>1 or h<0
break
end
S1=0:T/h;
S2=0:T/h;
S3=0:T/h;
S4=0:T/h;
i=1;
% 迭代过程
for t=0:h:T
Y=(exp(-t));
R=(1/(p-1))*exp(-t)+((p-2)/(p-1))*exp(-p*t);
y=y1+h*(-y1);
y1=y;
r=r1+h*(y1-p*r1);
r1=r;
S1(i)=Y;
S2(i)=R;
S3(i)=y;
S4(i)=r;
i=i+1;
end
t=[0:h:T];
% 红线为解析解,'x'为数值解
plot(t,S1,'r',t,S3,'x')
改进欧拉法
clc
clear
p=10; %贝塔的取值
T=10; %t取值的上限
y1=1; %y1的初值
r1=1; %y2的初值
%输入步长h的值
h=input('改进欧拉法please input number(h=1 0.5 0.25 0.125 0.0625):h=') ; if h>1 or h<0
break
end
S1=0:T/h;
S2=0:T/h;
S3=0:T/h;
S4=0:T/h;
i=1;
% 迭代过程
for t=0:h:T
Y=(exp(-t));
R=(1/(p-1))*exp(-t)+((p-2)/(p-1))*exp(-p*t);
k1=-y1;
l1=y1-p*r1;
k2=-(y1+h*k1);
l2=y1+h*k1-p*(r1+h*l1);
y=y1+h*(k1+k2)/2;
r=r1+h*(k1+k2)/2;
r1=r;
y1=y;
S1(i)=Y;
S2(i)=R;
S3(i)=y;
S4(i)=r;
i=i+1;
end
t=[0:h:T];
% 红线为解析解,'x'为数值解
plot(t,S1,'r',t,S3,'x')
高斯-赛德尔
function gaosisaideer
n=input('n='); %阶数
tol=input('tol='); %迭代精度
A=zeros(n,n);
b=zeros(n,1); %生成b向量
for i=1:n %给Hilbert矩阵和b向量赋值for j=1:n
A(i,j)=(1/(i+j-1));
end
b(i,1)=sum(A(i,:));
end
y=zeros(n,1); %迭代解
x1=zeros(n,1); %准确解
for i=1:n
y(i,1)=0; %迭代解赋初值
x1(i,1)=1; %生成准确解
end
k=0;
while norm(y-x1)>=tol %精度控制(采用自动步数控制) k=k+1;
for i=1:n %迭代开始
a1=0;
a2=0;
for j=1:i-1
a1=a1+A(i,j)*y(j,1);
end
for j=i+1:n
a2=a2+A(i,j)*y(j,1);
end
y(i,1)=(b(i,1)-a1-a2)/A(i,i);
end
end
disp('迭代步数k')
k
disp(y) %显示y
end
最速下降法
function gaosisaideer
n=input('阶数n='); %阶数
tol=input('迭代精度tol='); %迭代精度
eps=input('最速下降法eps=');
A=zeros(n,n);
b=zeros(n,1); %生成b向量
for i=1:n %给Hilbert矩阵和b向量赋值
for j=1:n
A(i,j)=(1/(i+j-1));
end
b(i,1)=sum(A(i,:));
end
y=zeros(n,1); %迭代解
x1=zeros(n,1); %准确解
t=zeros(n,1);
r=zeros(n,1);
for i=1:n
y(i,1)=0; %迭代解赋初值
x1(i,1)=1; %生成准确解
end
r=b-A*y;
while norm(r)>=eps; %先进行最速下降法求得进行赛德尔迭代的初始解y
t=(r'*r)/(r'*A*r);
s1=t*r;
y=y+s1;
r=b-A*y;
end
k=0;
while norm(y-x1)>=tol %精度控制(采用自动步数控制)
k=k+1;
for i=1:n %迭代开始
a1=0;
a2=0;
for j=1:i-1
a1=a1+A(i,j)*y(j,1);
end
for j=i+1:n
a2=a2+A(i,j)*y(j,1);
end
y(i,1)=(b(i,1)-a1-a2)/A(i,i);
end
end
disp('迭代步数k')
disp(k)
disp(y) %显示y
四阶龙格-库塔法
clc
clear
p=10; %贝塔的取值
T=10; %t取值的上限
y1=1; %y1的初值
r1=1; %y2的初值
%输入步长h的值
h=input('四阶龙格please input number(h=1 0.5 0.25 0.125 0.0625):h=') ; if h>1 or h<0
break
end
S1=0:T/h;
S2=0:T/h;
S3=0:T/h;
S4=0:T/h;
i=1;
% 迭代过程
for t=0:h:T
Y=(exp(-t));
R=(1/(p-1))*exp(-t)+((p-2)/(p-1))*exp(-p*t);
k1=-y1;
l1=y1-p*r1;
k2=-(y1+h*k1/2);
l2=y1+h*k1/2-p*(r1+h*l1/2);
k3=-(y1+h*k2/2);
l3=y1+h*k2/2-p*(r1+h*l2/2);
k4=-(y1+h*k3);
l4=y1+h*k3-p*(r1+h*l3);
y=y1+h*(k1+2*k2+2*k3+k4)/6;
r=r1+h*(l1+2*l2+2*l3+l4)/6;
r1=r;
y1=y;
S1(i)=Y;
S2(i)=R;
S3(i)=y;
S4(i)=r;
i=i+1;
end
t=[0:h:T];
% 红线为解析解,'x'为数值解plot(t,S1,'r',t,S3,'x')。