目次
1.多項式微分積分
1.1 差動
- 関数 f(x) の導関数は次のように記述されます: F'(x) または
- x に対する関数 f(x) の変化率
f(x0)は点x0における曲線に接する直線の係数を表します。
1.2 多項式微分
多項式: の場合、 その微分多項式は次のようになります。
1.3 Matlab を正しく使用するには?
1.3.1 Matlab は多項式を表現します
上の式は、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
次数以下の多項式の係数です (降べきの順に並べられます)。
例 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:
多項式をグラフ化して評価する
>> 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 の係数で表される多項式の導関数を返します。
例:
多項式 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
構文 2:k= polyder(a,b)
a
多項式 b
の和の積の導関数 を返します。
例:
多項式 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
の和の商の導関数 を返します 。
例:
商の多項式を表す 2 つのベクトルを作成します。
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
結果は次のとおりです。
1.4 多項式積分
多項式の場合:
積分多項式は次のとおりです。
1.4.1 正しい表現方法
1.4.2 Polyint() 多項式の統合
構文: q=polyint(p,k)パラメーター p が 1 つだけの場合、デフォルトの k は 0で、積分定数 k を使用して p の係数で表される多項式積分が返されます。
例:
2 つの多項式の積を積分する
- 多項式を表すベクトルを作成する
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 付近のセカントを計算する
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 誤差の精度
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;
2.4 二次および三次導関数
>> 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 数値積分
- 求積法 - 有限の点のセットで積分を近似します。
2.5.1 中間点ルール
例:
統合することで次のことがわかります。
しかし、中間点積分によって次のようにすることができます。
>> 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)
>> 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 シンプソンの積分法
>> 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 のポイント
ハンドルを通じてそれをどのように解決すればよいでしょうか?
>> 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