c++数值ab互换_【MATLB数值】—数值计算

论坛 期权论坛 编程之家     
选择匿名的用户   2021-5-28 11:20   508   0

1、多项式

(1)多项式表示方法

多项式

a6169361772539722363f05085840bfc.png

可以用向量表示为:y=[1 13 0 5 12];

对于缺少幂次项系数为0;

(2)多项式的运算

多项式乘除运算

计算代码:

clear 
clc
 
%多项式相乘conv
u=[2 4 5 6];%多项式
v=[10 20 30];%多项式
p=[1 2 3];%多项式
w=conv(u,v)  %conv为多项式相乘函数,也可以嵌套使用;
m=conv(conv(u,p),v)  
 
%多项式相除deconv
[q,r]=deconv(w,v) %q为商,r为余数;

结果:

w =
 
    20    80   190   280   270   180
 
m =
 
 20         120         410         900        1400        1560        1170         540
 
q =
 
     2     4     5     6
 
r =
 
     0     0     0     0     0     0

多项式的导函数

k=polyder(p),返回多项式p的导函数;
k=polyder(a,b),返回多项式a乘以b的导函数;
[q,d]=polyder(b,a),返回多项式b整除a的导函数,其分子返回给q,分母为d;

clear
clc
x=[1 2 3 4];
y=[1 2 3 4];
z=polyder(x,y)

z =
 
     6    20    40    60    50    24

多项式求值

y=polyval(p,x),代数多项式求值,若x为一数值,则求在该点的值;若为向量、矩阵,则求向量、矩阵中的每一个值;
y=polyvalm(p,x),矩阵多项式求值,要求x为方阵;

p=[1,2,3];
x=1:5;
y=polyval(p,x)
y =
 
     6    11    18    27    38

多项式的根

函数roots:可以求出多项式等于0的根;
函数poly:可以通过多项式等于0的根,求出多项式;

p=[1 2 1];
r=roots(p) %求p的根
v=poly(r)  %求r根的多项式
r =
 
    -1
    -1
 
 
v =
 
     1     2     1

2、曲线拟合

曲线拟合用一个比较简单的函数去逼近一个未知的函数,曲线拟合最优的标准采用最小二乘法原理,拟合的结果使得误差的平方和最小。

在MATLAB上最常采用polyfit函数来求最小二乘拟合多项式的系数,再用polyval函数求出多项式在所给出点的值;

x=linspace(0,2*pi,50);
y=cos(x);
p=polyfit(x,y,6);
t=linspace(0,2*pi,50);
y1=polyval(p,t);
plot(x,y,t,y1,'r*')

cedf22e82a687d58d794c0bb082fe3e2.png

从图像上可以看出拟合比较好,红色星号都在曲线上;

3、数据插值

(1)一维数据插值

插值函数:yi=interp1(x,y,xi,method)

根据在x,y处的值,计算函数在xi处的值,其中xi的值不能大于x的值;

method插值方法:linear(线性插值)、nearest(最近点插值)、cubic(3次多项式插值)、spline(3次样条插值);

例2:下面为1900—1990每隔10年的人口普查数据:

t=1900:10:1990;

p=[75 91 105 123 131 150 179 203 226 249]

求在1985年人口数值;

t=1900:10:1990;
p=[75 91 105 123 131 150 179 203 226 249];
yi=interp1(t,p,1985)

得出1985年的人口数为:

yi =
 
  237.5000

估计1900—2000年人口数值

t=1900:10:1990;
p=[75 91 105 123 131 150 179 203 226 249];
xi=1900:2000;
yi=interp1(t,p,xi,'spline');
plot(t,p,':o',xi,yi,'-r')

919533b9e3fce22166596436f105a33d.png

(2)二维数据插值

插值函数:Z1=interp2(X,Y,Z,XI,YI,method)

X,Y为原始采样点,Z为对应的采样值,XI,YI表示欲插值的点,method为插值方法与一维插值方法一样;

例3:为函数peaks插入更多的线条;

[X,Y]=meshgrid(-4:0.25:4);
Z=peaks(X,Y);
[XI,YI]=meshgrid(-4:0.125:4);
ZI=interp2(X,Y,Z,XI,YI);
mesh(X,Y,Z)
hold on
mesh(XI,YI,ZI+20)

ad4a35ebf9de85ebfae1aa24c32ccbb6.png

4、数值微积分

(1)数值微分

在MATLAB中没有直接求数值导数的函数,只有计算向前差分的函数diff,其调用格式为:

DX=diff(X):计算向量X的向前差分,DX(i)=X(i+1)-X(i),i=1......n-1;

DX=diff(X,n):计算X的n价向前差分;

DX=diff(A,n,dim):计算矩阵A的n价差分,dim=1(默认值)

x=[3 2 1];
dx=diff(x)
dx =
 
    -1    -1

(2)数值积分

  • 被积函数是解析式

MATLAB有两种函数求解定积分,调用格式为:

quad(函数,a,b,tol,trace)

quadl(函数,a,b,tol,trace)

其中,a为下限,b为上限,tol为精度,trace是否展现积分过程;

82cf4254bb8d7047a9b3783c3e6ace73.png
f=inline('1./(x.^3-2*x-5)');
y=quad(f,0,2)
y1=quadl(f,0,2) 
y =
 
   -0.4605
 
 
y1 =
 
   -0.4605
  • 被积函数为表格定义

用trapz(x,y)来进行计算,x为向量,y为x的函数;

a01b9de237e614b2509c40b429a1e073.png
x=0:0.01:1;
y=exp(-x.^2);
trapz(x,y)
ans =
 
    0.7468
  • 二重积分数值求解

MATLAB提供的函数为:

y=dblquad(f,a,b,c,d,tol,trace),

5b6c343024c2a5c3448fa7d4c6f10241.png
function f= fan(x,y)
f=x+y;
end

y=dblquad('fan',0,2,0,2)
y =
 
     8

5、线性方程组求解

(1)直接解法

对于方程Ax=b来说,可以用x=Ab;即x=inv(A)*b;

64b0f379a7785350a2432429219ac46a.png
A=[1 2 3;3 6 7;2 6 3];
b=[8 30 25]';
x=Ab
x =
 
   17.0000
    0.0000
   -3.0000

(2)LU求解、QR求解、Cholesky求解

A=[1 2 3;3 6 7;2 6 3];
b=[8 30 25]';
[L,U]=lu(A); %LU分解
x=U(Lb)
 
[Q,R]=qr(A); %QR分解
x_val=R(Qb)
 
R=chol(A);   %Cholesky分解
x_val_1=R(R'b)

6、常微分方程数值求解

龙格—库塔法,MATLAB提供的常微分方程求解的函数为:

[t,y]=ode23('fname',tspan,y0),二价、三价龙格—库塔法;

[t,y]=ode45('fname',tspan,y0),四价、五价龙格—库塔法;

fname是定义f(t,y)的函数文件名,该函数文件必须返回一个列向量;tspan形式为[t0,tf]表示求解区间,y0是初始状态列向量;t 给出时间向量,y为状态向量。

2cc6d420e51fa509983630cb5797f917.png
function f = fan(t,x)
f=[-2*x(2);x(1)];
end
tf=25;
[t,y]=ode45('fan',[t0,tf],[1,0]);
subplot(121);
plot(t,y(:,2))
subplot(122);
plot(y(:,2),y(:,1))
axis equal

8ddfc77adb479ef9060117d11962025b.png
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP