Matlab (数値微積分)

目次

1.多項式微分積分

1.1 差動

1.2 多項式微分

1.3 Matlab を正しく使用するには?

1.3.1 Matlab は多項式を表現します

1.3.2 Polyval() 多項式の評価

 1.3.3 Polyder() 多項式微分

1.4 多項式積分

1.4.1 正しい表現方法

1.4.2 Polyint() 多項式の統合

2. 数値微分と積分

2.1 数値微分

 2.2 diff() は差を計算します

  2.3 誤差の精度

 2.4 二次および三次導関数

 2.5 数値積分

 2.5.1 中間点ルール

 2.5.2 台形則(trapz)

2.5.3 シンプソンの積分法

2.5.4 3 つの統合方法の比較

3. 関数ハンドル

3.1 関数ハンドルの作成

 3.1.1 パラメータを使用した関数の処理

3.1.2 パラメータレスハンドル関数

3.1.3 パラメータも括弧もなし

3.2 無名関数

3.3 エラーのデモンストレーション

3.4integral()数値積分

3.4.1 レベル 1 のポイント

3.4.2integral2() の第 2 レベルの積分

3.4.3integral3() の第 3 レベルの積分


1.多項式微分積分

1.1 差動

  • 関数 f(x) の導関数は次のように記述されます: F'(x) または \frac{df(x)}{dx}
  • x に対する関数 f(x) の変化率

f(x0)は点x0における曲線に接する直線の係数を表します。

1.2 多項式微分

多項式: の場合、f(x)=a_{n}x^{n}+a_{n-1}x^{n-1}+...+a_{1}x+a_{0}   その微分多項式は次のようになります。

f(x)=a_{n}nx^{n-1}+a_{n-1}(n-1)x^{n-2}+...+2a_{2}x+a_{1}

1.3 Matlab を正しく使用するには?

1.3.1 Matlab は多項式を表現します

f(x)=x^{3}-2x-5  

上の式は、Matlab ではどのように表現すればよいでしょうか (Matlab では多項式は行ベクトルとして表現されます)

>> p=[1 0 -2 -5]

p =

     1     0    -2    -5

1.3.2 Polyval() 多項式の評価

構文: y=polyval(p,x)

y= polyval(p,x) 各点p での  多項式の値を計算します x引数は p 長さのベクトルで n+1 、その要素は n 次数以下の多項式の係数です (降べきの順に並べられます)。

p(x)=p_{1}x^{n}+p_{2}x^{n-1}+...+p_{n-1}x+p_{n}+1

例 1:

点 x=5、7、9 における多項式 p(x)=3x^2+2x+1 の値を計算します。

>> p = [3 2 1];
x = [5 7 9];
y = polyval(p,x)

y =

    86   162   262

 例 2:

f(x)=9x^{3}-5x^{2}+3x+7   (-2<=x<=5) 

多項式をグラフ化して評価する

>> 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)%设置字体大小

 1.3.3 Polyder() 多項式微分

構文 1: k=polyder(p)

k=polyder(p) は、p の係数で表される多項式の導関数を返します。  k(x)=\frac{d}{dx}p(x)

例:

多項式 p(x)=3x^5−2x^3+x+5 を表すベクトルを作成します。

p = [3 0 -2 0 1 5];

 Polyder を使用して多項式を微分すると、結果は次のようになります。 q(x)=15x^{4}-6x^{2}+1

q = polyder(p)
q = 1×5

    15     0    -6     0     1

 構文 2:k= polyder(a,b) a 多項式 b の和​​の積の導関数  を返します。 k(x)=\frac{d}{dx}[a(x)b(x)]

例:

多項式 a(x)=x^4−2x^3+11 および b(x)=x^2−10x+15 を表す 2 つのベクトルを作成します。

a = [1 -2 0 0 11];
b = [1 -10 15];
q = polyder(a,b)
q = 1×6

     6   -60   140   -90    22  -110
最終結果は次のとおりです。

構文 3:[q,d] = polyder(a,b)a 多項式 b の和​​の商の導関数  を返します 。\frac{q(x)}{d(x)}=\frac{d}{dx}[\frac{a(x)}{b(x)}]

例:

商の多項式を表す 2 つのベクトルを作成します。    \frac{x^{4}-3x^{2}-1}{x+4}

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

 結果は次のとおりです。

\frac{q(x)}{d(x)}=\frac{3x^{4}+16x^{3}-3x^{2}-24x+1}{x^{2}+8x+16 }

1.4 多項式積分

多項式の場合:f(x)=a_{n}x^{n}+a_{n-1}x^{n-1}+...+a_{1}x+a_{0}

 積分多項式は次のとおりです。 \int f(x)=\frac{1}{n+1}a_{n}x^{n+1}+\frac{1}{n}a_{n-1}x^{n}+。 ..+a_{0}x+k

1.4.1 正しい表現方法

1.4.2 Polyint() 多項式の統合

構文: q=polyint(p,k)パラメーター p が 1 つだけの場合、デフォルトの k は 0で、積分定数 k を使用して p の係数で表される多項式積分が返されます。

例:

2 つの多項式の積を積分する  I=\int_{0}^{2}(x^{5}-x^{3}+1)(x^{2}+1)dx

  • 多項式を表すベクトルを作成する
p = [1 0 -1 0 0 1];
v = [1 0 1];
  •  多項式を乗算し、積分定数 k=3 を使用して結果の式を積分します。
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
  •  積分範囲にわたって q を評価して I の値を求めます。
a = 0;
b = 2;
I = diff(polyval(q,[a b]))
I = 
     32.6667

2. 数値微分と積分

2.1 数値微分

  • 最も簡単な方法: 有限差分近似
  • x 付近のセカントを計算する   f'(x_{0})=\lim_{h \to0 } \frac{f((x_{0}+h)-f(x_{0}))}{h}  

 2.2 diff() は差を計算します

diff() は、ベクトル内の隣接する要素間の差を計算します。

x = [1 2 5 2 1];
diff(x)

>> x = [1 2 5 2 1];
diff(x)

ans =

     1     3    -3    -1

 例:

2 点間の傾きを求める

>> x = [1 2]; y = [5 7];
slope = diff(y)./diff(x) %y的变化量/x的变化量

slope =

     2

  2.3 誤差の精度

 f'(x_{0})=\lim_{h \to0 } \frac{f((x_{0}+h)-f(x_{0}))}{h}  h=0.1、0.01、0.001sの場合、f(x)=sin(x)   誤差はどうなりますか?

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;

 2.4 二次および三次導関数

f(x)=x^{3}     (-2<=x<=2)

>> 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);

 2.5 数値積分

s=\int_{a}^{b}f(x)d(x)\おおよそ \sum_{i=0}^{n}f(x_{i})\int_{a}^{b}L_{ i}(x)dx

  • 求積法 - 有限の点のセットで積分を近似します。

 2.5.1 中間点ルール

 例:

統合することで次のことがわかります。

A=\int_{0}^{2}4x^{3}dx=x^{4}|_{0}^{2}=(2)^{4}-(0)^{4}=16

しかし、中間点積分によって次のようにすることができます。

>> 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;

 2.5.2 台形則(trapz)

 A=\int_{0}^{2}4x^{3}dx=x^{4}|_{0}^{2}=(2)^{4}-(0)^{4}=16

>> 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

2.5.3 シンプソンの積分法

 A=\int_{0}^{2}4x^{3}dx=x^{4}|_{0}^{2}=(2)^{4}-(0)^{4}=16


>> 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

2.5.4 3 つの統合方法の比較

解析から簡単に得られますシンプソンの積分法は誤差が最も小さいです

3. 関数ハンドル

       関数ハンドルは、関数を指す関連付けを保存する Matlab データ型です。関数を間接的に呼び出すと、呼び出し位置を考慮せずに関数を呼び出すことができます。関数ハンドルの一般的な用途は次のとおりです。

  • ある関数を別の関数に渡す (複合関数と呼ばれることが多い)
  • コールバック関数を指定する
  • プログラム ファイルに保存されるのではなく、インラインで定義される関数ハンドルを構築します (匿名関数)
  • メイン関数の外からローカル関数を呼び出す

h が関数ハンドルかどうかを確認する

isa(h,'function_handle')

3.1 関数ハンドルの作成

関数名の前に記号を追加して、 @ 関数へのハンドルを作成します。

f = @myfunction;

 3.1.1 パラメータを使用した関数の処理

ハンドルを使用して関数を呼び出すことは、関数を直接呼び出すことと同じです。次に例を示します。

function y = computeSquare(x)
y = x.^2;
end

ハンドルを作成し、4 の 2 乗を計算する関数を呼び出します。

f = @computeSquare;
a = 4;
b = f(a)
b =

    16

3.1.2 パラメータレスハンドル関数

関数が入力を必要としない場合は、次のように空のかっこを使用して関数を呼び出すことができます。

h = @ones;
a = h()
a =

    1

3.1.3 パラメータも括弧もなし

括弧が使用されていない場合、代入により別の関数ハンドルが作成されます

a = h
a = 

    @ones

3.2 無名関数

        無名関数へのハンドルを作成できます。無名関数は単一行の式に基づく MATLAB 関数であり、プログラム ファイルは必要ありません。anonymous_function 関数本体と、 匿名関数arglist への入力引数のカンマ区切りのリストを定義することにより、匿名関数へのハンドルを構築します 。構文は次のとおりです。

h = @(arglist)anonymous_function

たとえば、平方数を計算する無名関数へのハンドルを作成し sqr、そのハンドルを使用して無名関数を呼び出します。

sqr = @(n) n.^2;
x = sqr(3)
x =

     9

3.3 エラーのデモンストレーション

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
...

3.4integral()数値積分

3.4.1 レベル 1 のポイント

\int_{0}^{2}\frac{1}{x^{3}-2x-5}dx

ハンドルを通じてそれをどのように解決すればよいでしょうか?

>> y = @(x) 1./(x.^3-2*x-5);
integral(y,0,2)

ans =

   -0.4605

3.4.2integral2() の第 2 レベルの積分


>> f = @(x,y) y.*sin(x)+x.*cos(y);
integral2(f,pi,2*pi,0,pi)

ans =

   -9.8696

3.4.3integral3() の第 3 レベルの積分


>> f = @(x,y,z) y.*sin(x)+z.*cos(y);
integral3(f,0,pi,0,1,-1,1)

ans =

    2.0000

おすすめ

転載: blog.csdn.net/dfdbb6b/article/details/132630718