MATLAB: [6] 数値計算と方程式の解法

目次

6.1 数値微分と数値積分

6.2 線形方程式を解く

6.3 非線形方程式の解法と関数極値の計算

6.4 常微分方程式の数値解法


6.1 数値微分と数値積分

数値微分

  • 微積分では、x_0任意の関数 f(x) の点での導関数は極限によって定義されるため、差分商を使用して点での導関数を近似できますx_0

  •  数値微分の実装

dx = diff(x) は、ベクトル x の前方差分 dx(i)=x(i+1)-x(i) を計算します。

dx = diff(x, n) は、ベクトル x の n 次前方差分を計算します。

dx = diff(A, n, dim) 行列の n 次の差分を計算します。dim=1 (デフォルト状態) の場合、列ごとに差分を計算し、dim=2 の場合、行ごとに差分を計算します。

 数値積分

  • 多くの場合、ニュートン-ライプニッツの式を使用して関数の積分を見つけたり、数値解法を使用して定積分の近似値を解いたりします. 基本的な考え方は、区間を n 個の部分区間に分解し、それらを合計することです.

  •  数値積分の実現

[l, n] = quad(filename, a, b, tol, trace ) 適応シンプソン法に基づく

[l, n] = quadl(filename, a, b, tol, trace ) 適応シンプソン法に基づく

その中で、filename は被積分関数の名前です; a と b は定積分の上限と下限です (積分限界は有限でなければなりません)、tol は積分状況を制御するために使用され、デフォルトで取得されますtol=10^{-6}, トレース制御0 でない場合、積分プロセスを表示するかどうか 0 に設定されている場合、表示されません (デフォルト)。戻りパラメーター I は定積分の値であり、n は関数の呼び出し回数です。被積分関数。

l = 積分 (ファイル名, a, b ) はグローバル適応積分法に基づく

その中で、filename は被積分関数の名前で、a と b は定積分の上限と下限 (積分の極限は無限大である可能性があります) であり、戻りパラメーター I は定積分の値です。

[l, err] = quadgk(filename, a, b) 適応ガウスクロンロッド法に基づく

このうち, err はおおよその誤差範囲を返します. 他のパラメータの意味と使い方は quad 関数と同じです. 積分の上限と下限は無限実数 (-Inf または Inf), または複素数にすることができます.積分の上限と下限は複素数で、quadgk 関数は複素平面にあります。 ポイントを見つけます。

l = trapz(x, y) 台形積分に基づく

その中で、ベクトル x, y は関数関係 y=f(x) を定義します。

  • 多重定積分の数値解法

\int ^d_c\int ^b_af(x,y)dxdy

l = integral2(ファイル名、a、b、c、d)

l = quad2d(ファイル名、a、b、c、d)

l = dblquad(ファイル名、a、b、c、d、tol) 

 \int^f_e\int^d_c\int^b_af(x,y,z)dxdydz

l = integral3(ファイル名、a、b、c、d、e、f)

l = triplequad(ファイル名、a、b、c、d、e、f、tol)

6.2 線形方程式を解く

直接法

  • 左除算演算子を使用した直接解法

Ax=b なので x=A\b

右辺の項が n*m の行列の場合、x=A\b は同じスパース行列 A をもつ m 個の線形方程式の数値解 x を同時に得ることができ、x は n*m の行列です。つまり、 , x(:,j)= A\b(:,j),j=1,2,...,m

A=[2,1,-5,1;1,-5,0,7;0,2,1,-1;1,6,-1,-4];
b=[13,-9,6,0]';
x=A\b
  •  行列因数分解を使用した線形方程式系の解法

主に次の3つの分解方法に分けられます

  1. LU 分解 (これを例にとります)
  2. QR分解
  3. Cholesky分解

基本的な考え方は次のとおりです。

分解関数

[L, U]=lu(A) 上三角行列 U と変換された下三角行列 L を生成し、A=LU を満たすようにします. ここで行列 A は正方行列でなければならず、最終的に x=U\ (L\b)

[L,U,P]=lu(A) 上三角行列 U と下三角行列と順列行列 P を生成し、PA=LU を満たすようにし、最終的に x=U\(L\P*b)

A=[2,1,-5,1;1,-5,0,7;0,2,1,-1;1,6,-1,-4];
b=[13,-9,6,0]';
[L,U]=lu(A);
x=U\(L\b)

反復法

  • ヤコビ反復法

 x が収束する場合、それが解決された値です。

function [y,n]=jacobi(A,b,x0,ep) 
D=diag(diag(A));
L=-tril(A,-1);
U=-triu(A,1);
B=D\(L+U);
f=D\b;
y=B*x0+f;
n=1;
while norm(y-x0)>=ep
    x0=y;
    y=B*x0+f;
    n=n+1;
end

 x0 は初期値セット、n は反復回数、以下同じ

  • ガウス・ザイデル反復法(高精度)
function [y,n]=gauseidel(A,b,x0,ep)
D=diag(diag(A));
L=-tril(A,-1); 
U=-triu(A,1);
B=(D-L)\U;
f=(D-L)\b;
y=B*x0+f;
n=1;
while norm(y-x0)>=ep
    x0=y;
    y=B*x0+f;
    n=n+1;
end

6.3 非線形方程式の解法と関数極値の計算

非線形方程式の解法

x=fzero(filename,x0) ここで、filename は解く方程式の左辺の関数式、x0 は初期値です。

x=fsolve(filename,x0,option) オプションは、非線形方程式を解くことができる optimset('Display','off') に設定できる最適化パラメーターです。

f=@(x) [sin(x(1))+x(2)+x(3)^2*exp(x(1)),x(1)+x(2)+x(3),x(1)*x(2)*x(3)];
f([1,1,1])
x=fsolve(f,[1,1,1],optimset('Display','off'))
f(x)

関数極値計算

  • 制約のない最適化問題

[xmin, fmin] = fminbnd(ファイル名, x1, x2, オプション) 

[xmin, fmin] = fminsearch(ファイル名, x0, オプション) 

[xmin, fmin] = fminunc(ファイル名, x0, オプション)  

このうち、x1 と x2 は調査間隔の左右の境界であり、x0 は極値点を表す初期値です。

  • 制約付き最適化問題
  1. 線形不等式制約
  2. 線形等式制約
  3. 非線形不等式制約
  4. 非線形等式制約
  5. x の上限と下限

 [xmin, fmin] = fmincon(ファイル名, x0, A, b, Aep, bep, Lbnd, Ubnd, NonF, オプション)

このうち xmin, fmin, fiename, x0, option は最小値関数と同じ意味を持つ. 残りのパラメータは制約であり, 線形不等式制約, 線形等式制約, x の下限と上限, および非線形制約を定義します. 制約が存在しない場合, 空の行列で表されます.

6.4 常微分方程式の数値解法

一般的な概念

  • y'=f(t, y) を満たす関数 y を見つけます

関数を解く

[t, y] = ソルバー(ファイル名, tspan, y0, オプション)

  • このうち、t と y はそれぞれ時間ベクトルと対応する数値解を与える. solver は常微分帰過程の数値解を求める関数. filename は f(t, y) を定義する関数の名前であり,関数は列ベクトルを返す必要があります. tspan の形式は [t0, tf] で、これは解の区間を意味し、y0 は初期状態の列ベクトルで、option はオプションのパラメータで、解のプロパティを設定するために使用されます。
  • ソルバー関数は命名方法が統一されており、odennxx.nn は左右のメソッドの順序を示し、ode45 が一般的に使用されます。
f=@(t,y) (y^2-t-2)/4/(t+1);
[t,y]=ode23(f,[0,10],2);
y1=sqrt(t+1)+1;
plot(t,y,'b:',t,y1,'r');

剛体問題

  • ソリューションの一部のコンポーネントは急速に変化し、一部は非常にゆっくりと変化し、その違いは非常に大きく、いわゆる硬直的な問題 (スティッフ)

関数 ode15s を解き、上記と同じ方法を使用します

おすすめ

転載: blog.csdn.net/Alex497259/article/details/104595592