Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

クラスによる多项の表现

オブジェクトの要件

この例は、多項式を表すクラスを MATLAB®言語で実装します。設計要件は以下のとおりです。

  • 値クラスの動作 - 多項式オブジェクトは、コピーして関数に渡すときに MATLAB 数値変数のように動作します。

  • 表示とインデックス特化

  • オブジェクトはスカラーのみです。表示とインデックス機能の特化により通常の配列動作は妨げられます。

  • 算术演算

  • Matlab关数关数关数关数と多项オブジェクトとのをを简略简略简略化するするするするするするするするするするするするする

DocPolynomクラスメンバー

クラスの,を保存するためプロパティを指定,クラスのの定义定义を(@DocPolynom)を定義します。

次の表は、DocPolynomクラスに対してさプロパティをてあります。

DocPolynomクラスプロパティ

名前

クラス

既定

说明

coef

double

[]

多项式[最高...最...最次数]

次の表は、DocPolynomクラスのメソッドをまとめてあります。

DocPolynomクラスメソッド

名前

说明

DocPolynom

クラスコンストラクター

double

DocPolynomDouble doubleに変换ますます(系数系数ベクトルますます)

char

Xのべき乘てDocPolynomオブジェクトの書式付き表示を作成し、dispメソッドにより使用されます

disp

MATLAB がDocPolynomオブジェクトをにどのに表示するをますますます

子ref

独立変数値として指定できますまた,ドット表记でcoefプロパティにアクセスしたり、メソッドを呼び出すことができます。

DocPolynomオブジェクトの加算を実装します

minus

DocPolynomオブジェクトのを実装します

mtimes

DocPolynomオブジェクトのを実装します

DocPolynomクラスの使用

次の例,DocPolynomクラスの的使用方法を示し。。

次の多項式を表すDocPolynomオブジェクトをしコンストラクター关数の引数は,多项式系数およびが含まれ。

p1 = docpolynom([[1 0 -2 -5])
p1 = x^3-2*x -5
p2= DocPolynom([2 0 3 2 -7])
p2 = 2*x^4 + 3*x^2 + 2*x -7

系数を关数に渡す,多项の根をし。。。

根((p1。coef)
ans = 2.0946 + 0.0000i -1.0473 + 1.1359i -1.0473 - 1.1359i

2つの式p1p2を加算します。

MATLAB は、2 つのDocPolynomオブジェクトを加算とき,DocPolynomクラスに対して定义れたメソッドを呼び出します。

p1+p2
ans = 2*x^4 + x^3 + 3*x^2 - 12

DocPolynomクラスの概要

コード例 说明
classdefDocPolynom

多項式のデータ型を実装する値クラス。

propertiescoef结尾

多项式[最高...最...最次数]

methods

メソッドについて一般情报は,通常のメソッドを参照してください。

功能obj = docpolynom(c)如果nargin > 0如果伊萨((c,'DocPolynom')obj。coef = c.coef;别的obj。系数= c(:)。';结尾结尾结尾

クラスコンストラクターが以下を使用してオブジェクトを作成します。

  • 既存のオブジェクト系数ベクトル

  • 引数としてれた系数ベクトル

docpolynomコンストラクターを参照してください。

功能obj = set.coef(obj,val)如果~isa(val,'双倍的') 错误('Coefficients must be doubles'结尾ind = find(val(:)。'〜= 0);如果~isempty(ind); obj.coef = val(ind(1):end);别的obj.coef = val;结尾结尾

coefプロパティの set メソッド:

  • 双型のを许可ますますます

  • 系数ベクトル先头のを削除します

不要な系数削除を参照してください。

功能c = double(obj) c = obj.coef;结尾

系数を返してDocPolynomオブジェクトをdoubleに変换し。

他のタイプへの DocPolynom オブジェクトの変換を参照してください。

功能str = char(obj)如果all(obj.coef == 0) s ='0'; str = s;返回别的d = length(obj.coef)-1; s = cell(1,d); ind = 1;为了a = obj.coef;如果a〜 = 0;如果ind〜 = 1如果a> 0 s(ind)= {' + '};ind = ind + 1;别的s(ind) = {' - '};a = -a; ind = ind + 1;结尾结尾如果A〜 = 1 ||d == 0如果a == -1 s(ind)= {' - '};ind = ind + 1;别的s(ind) = {num2str(a)}; ind = ind + 1;如果d > 0 s(ind) = {'*'};ind = ind + 1;结尾结尾结尾如果d >= 2 s(ind) = {['x^'int2str(d)]}; ind = ind + 1;别的如果d == 1 s(ind)= {'X'};ind = ind + 1;结尾结尾d = d -1;结尾结尾str = [s {:}];结尾

DocPolynomオブジェクトを次の式を表すcharに変换し。

y = f(x)

他のタイプへの DocPolynom オブジェクトの変換を参照してください。

功能disp((obj) c = char(obj);如果iscell(c)disp([' 'C{:}])别的disp((c)结尾结尾

关数dispをオーバーロードます。オブジェクトをcharメソッドのとして表示し。。

このコードについての詳細は、docpolynomのdispのオーバーロードを参照してください。

功能dispPoly (obj, x)p = char(obj);e = @(x)est(p);y =零(长度(x));disp([['y =',p])为了k = 1:长度(x)y(k)= e(x(k));disp([[' ',num2str(y(k)),。。。' = f(x = ',,,,。。。num2str(x(k)),')'])结尾结尾

評価した式をフォーマットされた出力で返します。

charメソッドの出力を使用して、独立変数の指定値で多項式を評価します。

このコードについての詳細は、评価さた式の表示を参照してください。

功能b = subsref(a,s)switchs(1).typecase'()'ind = s.subs{:}; b = polyval(a.coef,ind);case'。'switchs(1).subscase'coef'b = a.coef;case'disp'disp((a)otherwise如果长度(s)> 1 b = a。(s(1).subs)(s(2).subs {:});别的b = a.(s.subs);结尾结尾otherwiseerror('Specify value for x as obj(x)'结尾结尾

DocPolynomオブジェクトの付きを再定义し。。

このコードについての詳細は、インデックス付き参照再定义を参照してください。

功能r = plus(obj1,obj2)obj1 = docpolynom(obj1);obj2 = docpolynom(obj2);k =长度(obj2.coef) - 长度(obj1.coef);zp =零(1,k);zm =零(1,-K);r = docpolynom([ZP,obj1.coef] + [zm,obj2.coef]);结尾功能r =减(OBJ1,OBJ2)obj1 = docpolynom(obj1);obj2 = docpolynom(obj2);k =长度(obj2.coef) - 长度(obj1.coef);zp =零(1,k);zm =零(1,-K);r = DocPolynom([zp,obj1.coef] - [zm,obj2.coef]);结尾功能r = mtimes(obj1,obj2) obj1 = DocPolynom(obj1); obj2 = DocPolynom(obj2); r = DocPolynom(conv(obj1.coef,obj2.coef));结尾结尾

3つ算术を定义ます。。

  • 多项式の加算

  • 多项式の减算

  • 多项式の乘算

このコードの詳細については、算术演算子の定義を参照してください。

演算子の定義についての一般情報は、演算子のオーバーロードを参照してください。

结尾结尾

methodsおよびclassdef结尾ステートメント。

クラスコードの拡張

DocPolynomコンストラクター

次の関数は,ファイル@docpolynom/docpolynom.mにある、DocPolynomクラスのコンストラクター。

methods功能obj = docpolynom(c)如果伊萨((c,'DocPolynom')obj。coef = c.coef;别的obj。系数= c(:)。';结尾结尾结尾

コンストラクターの呼び出しの構文

2 つの異なる引数でDocPolynomコンストラクターを呼び出すます。

  • 入力引数がDocPolynomオブジェクト-既にDocPolynomオブジェクト入力で关数を场合,コンストラクターは入力引数と同じ系数系数新しい新しい新しいDocPolynomオブジェクトを返し。关数伊萨は,この入力をチェックします。

  • 入力引数が係数ベクトル — 入力引数がDocPolynomオブジェクトではない場合、このコンストラクターは、値をベクトルの形にしてからcoefプロパティに割り当て。

    coefプロパティの set メソッドは、プロパティの値を double に制限します。プロパティの set メソッドの説明は、不要な系数削除を参照してください。

DocPolynomのコンストラクターする例,以下ののにになります。

p= DocPolynom([1 0 -2 -5]) p = x^3 - 2*x -5

このステートメントは,DocPolynomクラスのインスタンスを指定した係数で作成します。オブジェクトの表示が、MATLAB 言語構文を使用する等価な多項式を表していることに注意してください。DocPolynomクラスは,dispcharクラスのメソッドを使用してこの表示を行います。

不要な系数削除

matlabにおける式,降顺のを含む行ベクトルれますます。。系数系数ベクトルのゼロはは,多多项からから除く除く项表し表ししたがっしたがっしたがっしたがっしたがっしたがってて,,。

DocPolynomクラスのメソッドには、多項式の次数を決めるために係数ベクトルの長さを使うものがあります。したがって、係数ベクトルが真の値を表すように、係数ベクトルから先頭のゼロを削除することが有効です。

DocPolynomクラスは,指定した係数から先頭のゼロを削除するために set メソッドを使用するプロパティにおいて、プロパティ値を設定する前に、係数ベクトルを格納します。

methods功能obj = set.coef(obj,val)如果~isa(val,'双倍的') 错误('Coefficients must be doubles'结尾ind = find(val(:)。'〜= 0);如果~isempty(ind); obj.coef = val(ind(1):end);别的obj.coef = val;结尾结尾结尾

他のタイプへのDocPolynomオブジェクトの変換

DocPolynomクラスクラスはつのつのを定义して,DocPolynomオブジェクトをのクラス変换します。

  • double-关数を使って係数に数学演算を実行できるように、double の数値型に変換します。

  • char- コマンドウィンドウする,出力书式设定使用するに変换します。

double コンバーター

DocPolynomクラスのdouble コンバーター メソッドは、係数ベクトルを返します。

methods功能c = double(obj) c = obj.coef;结尾结尾

DocPolynomオブジェクトpの場合、

p= DocPolynom([1 0 -2 -5]);

ステートメント、

c = double(p)

は,以下を返します。

c= 1 0 -2 -5

これは、doubleクラスになります。

class(c) ans = double

文字コンバーター

charメソッドは,Xのべきとしてされる多项式表す表すcharベクトルを生成します。返されるcharベクトルは構文的に正しい MATLAB 式です。

charcell配列配列使用し,表示れた多项式をするするするするcharベクトルの要素をまとめます。

dispメソッドは,するDocPolynomオブジェクトを書式化するためにcharメソッドを使用します。evalPolyメソッドはcharを使用して、評価する MATLAB 式を作成します。

DocPolynomオブジェクトのユーザーがcharまたはdispメソッドを直接呼び出す可能性は高くありませんが、これらのメソッドにより、DocPolynomMatlabのののデータとと动作できるようなりなり。。

以下は、charメソッドです。

methods功能str = char(obj)如果all(obj.coef == 0) s ='0'; str = s;返回别的d = length(obj.coef)-1; s = cell(1,d); ind = 1;为了a = obj.coef;如果a〜 = 0;如果ind〜 = 1如果a> 0 s(ind)= {' + '};ind = ind + 1;别的s(ind) = {' - '};a = -a; ind = ind + 1;结尾结尾如果A〜 = 1 ||d == 0如果a == -1 s(ind)= {' - '};ind = ind + 1;别的s(ind) = {num2str(a)}; ind = ind + 1;如果d > 0 s(ind) = {'*'};ind = ind + 1;结尾结尾结尾如果d >= 2 s(ind) = {['x^'int2str(d)]}; ind = ind + 1;别的如果d == 1 s(ind)= {'X'};ind = ind + 1;结尾结尾d = d -1;结尾结尾str = [s {:}];结尾结尾

docpolynomのdispのオーバーロード

DocPolynomオブジェクトのより有効な表示を与えるには、このクラスは、クラス定義においてdispをオーバーロードします。

このdispメソッドは,charメソッドによって、多項式のテキスト表現を画面上に表示します。

係数がすべて 0 の場合、charメソッドはcell 配列または文字'0'を返します。

methods功能disp((obj) c = char(obj);如果iscell(c)disp([' 'C{:}])别的disp((c)结尾结尾结尾

MATLABdispメソッドを呼び出す場合

次のステートメント

p= DocPolynom([1 0 -2 -5])

は,DocPolynomオブジェクトをますステートメントのにコロンない,出力出力结果はコマンドラインラインに次次のようにに表示表示

p = x^3-2*x -5

评価さた式の表示

charコンバーターメソッドは,DocPolynomオブジェクトによって表される多項式の MATLAB 式を形成します。脱离メソッドはcharメソッドによってれるを,指定さたたXの値评価します。

methods功能dispPoly (obj, x)p = char(obj);e = @(x)est(p);y =零(长度(x));disp([['y =',p])为了k = 1:长度(x)y(k)= e(x(k));disp([[' ',num2str(y(k)),。。。' = f(x = ',,,,。。。num2str(x(k)),')'])结尾结尾结尾

DocPolynomオブジェクトpを作成し。

p= DocPolynom([1 0 -2 -5])
p = x^3-2*x -5

Xが3 つの値[3 5 9]と等しいときの多項式を評価します。

脱离((p,,,,[3 5 9])
y = x^3-2*x -5 16 = f(x = 3)110 = f(x = 5)706 = f(x = 9)

インデックス付き参照再定义

DocPolynomクラスは式表すオブジェクト使用サポートするため,インデックス付き参照参照を再再定义しDocPolynomクラスでオブジェクトの添字によって添字と独立変数の値による多项式式の评価评価れれれ

たとえば、次の多項式を与えると、

DocPolynomオブジェクトpを作成し。

p= DocPolynom([1 0 -2 -5])
p = x^3-2*x -5

次の付きの式,,X= 3X= 4で多項式の値を評価し、結果の値を返します。

p(([3 4])
ans = 16 51

インデックス付き参照の設計目標

子refメソッドをて既定の添字参照を再定义し。。

クラスで子refメソッドをする添字付きの参照あるときは必ず必ず,,,,はははこのクラスのオブジェクトに対してに対してこのメ​​ソッドを子refメソッドは特定のケース,のインデックス付きの动作をを定义ししなければばなり。

DocPolynom子refメソッドは以下动作を実装し。。

  • p(x = [a1。。。an])-X= aで多項式を評価します。

  • P.Coef-coefプロパティの値にアクセスします。

  • p.disp- 出力をに多项式をを式式としてします。

  • obj = p.method((args)-ドット表記を使用して引数と共にメソッドを呼び出し、変更されたオブジェクトを返します。

  • obj = p.method-ドット表記を使用して引数なしでメソッドを呼び出し、変更されたオブジェクトを返します。

子ref実装の详细

子refメソッドは关数子refをオーバーロードします。

たとえば、関数polyvalへの呼び出しを考えます。

p= DocPolynom([1 0 -2 -5]) p = x^3 - 2*x - 5 polyval(p.coef,[3 5 7]) ans = 16 110 324

关数polyvalは以下を必要とします。

  • 多项式系数

  • 多項式の評価に使用する独立変数の値

关数polyvalはこうした値におけるf(x)の値をます。子refはステートメントを通してpolyvalを呼び出します。

case'()'ind = s.subs{:}; b = polyval(a.coef,ind);

ドット表记使用引数を伴うメソッドをサポートするために子refを実装する,typeおよびsubs構造フィールドのどちらにも複数の要素が含まれます。

子refメソッドはのリストに示さてように,のの添字参照を明示明示的的ますますます

methods功能b = subsref(a,s)switchs(1).typecase'()'ind = s.subs{:}; b = polyval(a.coef,ind);case'。'switchs(1).subscase'coef'b = a.coef;case'disp'disp((a)otherwise如果长度(s)> 1 b = a。(s(1).subs)(s(2).subs {:});别的b = a.(s.subs);结尾结尾otherwiseerror('Specify value for x as obj(x)'结尾结尾结尾

算术演算子の定義

多项式はか算术演算がをもちます。DocPolynomクラスはのメソッド実装します。

メソッドと构文

実装される演算子

加(a,b)

加算

minus(a,b)

减算

mtimes(a,b)

行列乗算

算术演算子をオーバーロードする場合は、サポートの必要があるデータ型を考慮します。minusおよびmtimesのメソッドは,DocPolynom-DocPolynomDocPolynom-doubleというオペランド组み合わせ加算,减算,を扱うように,DocPolynomクラスに対してされます。

+演算子の定義

pまたはDocPolynomオブジェクトである,次のについて考えます。

p + q

この式他方オブジェクトがより高いをもつのでなければ关数关数@docpolynom/plusを呼び出します。

次のメソッドはDocPolynomクラスの((+)演算子をオーバーロードします。

methods功能r = plus(obj1,obj2)obj1 = docpolynom(obj1);obj2 = docpolynom(obj2);k =长度(obj2.coef) - 长度(obj1.coef);zp =零(1,k);zm =零(1,-K);r = docpolynom([ZP,obj1.coef] + [zm,obj2.coef]);结尾结尾

この关数机能について说明。。

  • 両方の入力引数をDocPolynomオブジェクトにします。次のような式

    p+1

    は,DocPolynomdoubleの両方を含みますが、正しく動作します。

  • 2 つの係数ベクトルにアクセスし、必要な場合、一方にゼロを付加して両方を同じ長さにします。実際の加算は、2 つの係数ベクトルのベクトル和です。

  • DocPolynomコンストラクターを呼び出して、適切な型のオブジェクトを多項式の加算結果として作成します。

-演算子の定義

((+)演算子と同じ方法で、minus演算子 (-)を実装します。

minusメソッドはp-を计算ます。优先ははDocPolynomオブジェクトでなければなりません。

methods功能r =减(OBJ1,OBJ2)obj1 = docpolynom(obj1);obj2 = docpolynom(obj2);k =长度(obj2.coef) - 长度(obj1.coef);zp =零(1,k);zm =零(1,-K);r = DocPolynom([zp,obj1.coef] - [zm,obj2.coef]);结尾结尾

*演算子の定義

mtimesメソッドを実装て积p*问を计算ます。つつの式の乘算,それらの系数ベクトルの(conv)であるため、mtimesメソッドは"行列" の乗算を実装します。

methods功能r = mtimes(obj1,obj2) obj1 = DocPolynom(obj1); obj2 = DocPolynom(obj2); r = DocPolynom(conv(obj1.coef,obj2.coef));结尾结尾

算术演算子の方法

DocPolynomオブジェクトがられた场合,

p= DocPolynom([1 0 -2 -5]);

次の 2 つの算術演算は、DocPolynommtimesメソッドを呼び出します。

问= p+1; r = p*q;

次のが出力さ。。

q = x^3-2*x -4 r = x^6-4*x^4-9*x^3 + 4*x^2 + 18*x + 20