目录
f (x0) 表示点x0处曲线相切的直线的系数。
对于一个多项式: 来说,其微分多项式为:
在上式中,我们用Matlab应该怎么进行表示(多项式在Matlab中被表示为行向量)
- >> p=[1 0 -2 -5]
-
- p =
-
- 1 0 -2 -5
语法:y=polyval(p,x)
y= polyval(p,x)
计算多项式 p
在 x
的每个点处的值。参数 p
是长度为 n+1
的向量,其元素是 n
次多项式的系数(降幂排序):
示例1:
计算多项式 p(x)=3x^2+2x+1在点 x=5、7 、9 处的值。
- >> p = [3 2 1];
- x = [5 7 9];
- y = polyval(p,x)
-
- y =
-
- 86 162 262
示例2:
对该多项式进行画图求值
- >> a = [9,-5,3,7]; x = -2:0.01:5;
- f = polyval(a,x);
- plot(x,f,'LineWidth', 2);%设置线条粗度
- xlabel('x轴'); ylabel('f(x)');%设置xy轴名称
- set(gca, 'FontSize', 14)%设置字体大小
语法一:k=polyder(p)
k=polyder(p)返回的p中的系数表示的多项式的导数
示例:
创建一个向量来表示多项式 p(x)=3x^5−2x^3+x+5。
p = [3 0 -2 0 1 5];
使用polyder对多项式进行求导,结果为:
- q = polyder(p)
- q = 1×5
-
- 15 0 -6 0 1
语法二:k= polyder(a,b)
返回多项式 a
和 b
的乘积的导数
示例:
创建两个向量来表示多项式 a(x)=x^4−2x^3+11 和 b(x)=x^2−10x+15。
- a = [1 -2 0 0 11];
- b = [1 -10 15];
- q = polyder(a,b)
- q = 1×6
-
- 6 -60 140 -90 22 -110
最后的结果为:
语法三:[q,d] = polyder(a,b)
返回多项式 a
和 b
的商的导数
示例:
创建两个向量来表示商中的多项式
- p = [1 0 -3 0 -1];
- v = [1 4];
- [q,d] = polyder(p,v)
- q = 1×5
-
- 3 16 -3 -24 1
-
- d = 1×3
-
- 1 8 16
结果为:
对于一个多项式:
积分多项式为:
语法:q=polyint(p,k) 如果只有的一个参数p,默认k是0,使用积分常量k返回p中的系数所表示的多项积分
示例:
对两个多项式的乘积求积分
- p = [1 0 -1 0 0 1];
- v = [1 0 1];
- k = 3;
- q = polyint(conv(p,v),k)
- q = 1×9
-
- 0.1250 0 0 0 -0.2500 0.3333 0 1.0000 3.0000
- a = 0;
- b = 2;
- I = diff(polyval(q,[a b]))
- I =
- 32.6667
diff() 计算向量中相邻元素之间的差值
- x = [1 2 5 2 1];
- diff(x)
- >> x = [1 2 5 2 1];
- diff(x)
-
- ans =
-
- 1 3 -3 -1
示例:
求出两点之间的斜率
- >> x = [1 2]; y = [5 7];
- slope = diff(y)./diff(x) %y的变化量/x的变化量
-
- slope =
-
- 2
当 h=0.1、0.01、0.001s时误差有什么变化?
当h=0.1时:
- >> x0 = pi/2; h = 0.1;
- x = [x0 x0+h];
- y = [sin(x0) sin(x0+h)];
- m = diff(y)./diff(x)
-
- m =
-
- -0.0500
当h=0.01时:
- >> x0 = pi/2; h = 0.01;
- x = [x0 x0+h];
- y = [sin(x0) sin(x0+h)];
- m = diff(y)./diff(x)
-
- m =
-
- -0.0050
当h=0.001时:
- >>
- x0 = pi/2; h = 0.001;
- x = [x0 x0+h];
- y = [sin(x0) sin(x0+h)];
- m = diff(y)./diff(x)
-
- m =
-
- -5.0000e-04
由分析得:所以当h->0时,误差越小
- g = colormap(lines); hold on;
- for i=1:4
- x = 0:power(10, -i):pi;
- y = sin(x); m = diff(y)./diff(x);
- plot(x(1:end-1), m, 'Color', g(i,:));%每次微分,系数的个数少1
- end
- hold off;
- set(gca, 'XLim', [0, pi/2]); set(gca, 'YLim', [0, 1.2]);
- set(gca, 'FontSize', 18); set(gca, 'FontName', 'symbol');
- set(gca, 'XTick', 0:pi/4:pi/2);
- set(gca, 'XTickLabel', {'0', 'p/4', 'p/2'});
- h = legend('h=0.1','h=0.01','h=0.001','h=0.0001');
- set(h,'FontName', 'Times New Roman'); box on;
- >> x = -2:0.005:2; y = x.^3;
- m = diff(y)./diff(x);
- m2 = diff(m)./diff(x(1:end-1));
- plot(x,y,x(1:end-1),m,x(1:end-2),m2);%每次导数系数减1
- xlabel('x', 'FontSize', 18);
- ylabel('y', 'FontSize', 18);
- legend('f(x) =x^3','f''(x)','f''''(x)');
- set(gca, 'FontSize', 18);
示例:
我们通过积分可以求得:
但是我们通过中点积分可得:
- >> h = 0.05; x = 0:h:2;
- midpoint = (x(1:end-1)+x(2:end))./2;
- y = 4*midpoint.^3;
- s = sum(h*y)
-
- s =
-
- 15.9950
解释:
midpoint = (x(1:end-1)+x(2:end))./2;
- >> h = 0.05; x = 0:h:2; y = 4*x.^3;
- s = h*trapz(y)
-
- s =
-
- 16.0100
我们也可以自定义该函数:
- h = 0.05; x = 0:h:2; y = 4*x.^3;
- trapezoid = (y(1:end-1)+y(2:end))/2;
- s = h*sum(trapezoid)
-
- s =
-
- 16.0100
-
- >> h = 0.05; x = 0:h:2; y = 4*x.^3;
- s = h/3*(y(1)+2*sum(y(3:2:end-2))+...
- 4*sum(y(2:2:end))+y(end))
-
- s =
-
- 16
由分析易得: 辛普森积分法误差最小
函数句柄是一种存储指向函数的关联关系的Matlab数据类型,间接调用函数使您在调用函数时无需考虑调用位置,函数句柄的典型用法包括:
查看h是否是函数句柄
isa(h,'function_handle')
通过在函数名称前添加一个 @
符号来为函数创建句柄。
f = @myfunction;
使用句柄调用函数的方式与直接调用函数一样,例如:
- function y = computeSquare(x)
- y = x.^2;
- end
创建句柄并调用该函数以计算 4 的平方。
- f = @computeSquare;
- a = 4;
- b = f(a)
- b =
-
- 16
如果该函数不需要任何输入,则您可以使用空括号调用该函数,例如:
- h = @ones;
- a = h()
- a =
-
- 1
如果不使用括号,则该赋值会创建另一个函数句柄。
- a = h
- a =
-
- @ones
您可以创建指向匿名函数的句柄。匿名函数是基于单行表达式的 MATLAB 函数,不需要程序文件。构造指向匿名函数的句柄,方法是定义 anonymous_function
函数主体,以及指向匿名函数 arglist
的以逗号分隔的输入参数列表。语法为:
h = @(arglist)anonymous_function
例如,创建一个指向用于计算平方数的匿名函数的句柄 sqr
,并使用其句柄调用该匿名函数。
- sqr = @(n) n.^2;
- x = sqr(3)
- x =
-
- 9
- function [y] = xy_plot(input,x)
- % xy_plot receives the handle of a function
- % and plots that function of x
- y = input(x); plot(x,y,'r--');
- xlabel('x'); ylabel('function(x)');
- end
-
- >> xy_plot(sin,0:0.01:2*pi)
- 错误使用 sin
- 输入参数的数目不足。
调用参数的时候,如果该参数也是一个函数,这个时候直接将函数当成参数输入进去是不妥的,会直接报错,这个时候我们就需要句柄
- >>
- xy_plot(@sin,0:0.01:2*pi)
-
- ans =
-
- 列 1 至 11
-
- 0 0.0100 0.0200 0.0300 0.0400 0.0500 0.0600 0.0699 0.0799 0.0899 0.0998
-
- 列 12 至 22
-
- 0.1098 0.1197 0.1296 0.1395 0.1494 0.1593 0.1692 0.1790 0.1889 0.1987 0.2085
-
- 列 23 至 33
-
- 0.2182 0.2280 0.2377 0.2474 0.2571 0.2667 0.2764 0.2860 0.2955 0.3051 0.3146
- ...
我们通过句柄该怎么去解决呢?
- >> y = @(x) 1./(x.^3-2*x-5);
- integral(y,0,2)
-
- ans =
-
- -0.4605
-
- >> f = @(x,y) y.*sin(x)+x.*cos(y);
- integral2(f,pi,2*pi,0,pi)
-
- ans =
-
- -9.8696
-
- >> f = @(x,y,z) y.*sin(x)+z.*cos(y);
- integral3(f,0,pi,0,1,-1,1)
-
- ans =
-
- 2.0000