1

MATLAB に X と Y の 2 つのベクトル
があります。Y は X の関数ですが、X は Y の関数ではありません。

指定された Y 値のスプライン (X,Y) から X 値を取得したいと思います。

これどうやってするの?スプラインから pp を使用してみましたが、あまりうまくいきませんでした。

4

2 に答える 2

3

x は y の関数ではないと自分で言います。これは、少なくとも y のいくつかの値に対して、問題に対する複数の解決策があることを意味します。

MATLAB で使用される pp 形式の施設に応じて、いくつかの選択肢があります。最初に...

ルートが存在する区間を識別するためにブラケット スキームを使用します。スプラインが与えられた間隔で非単調である場合、ここで注意を払う必要があるかもしれませんが、3 次多項式が最大値/最小値に達する場所を見つけることは難しくありません。二次多項式。

ソリューションの間隔ができたら、次のようにします。

  1. fzero を使用して、(f(x)-y) の解を見つけることができます。ほとんどの場合、fzero はブラケットを使用する必要はありませんが、悪い場合には解決策を見つけられない場合があります。また、括弧を指定すると、解が複数ある場合、fzero は選択した解を見つけます。(その場合、常に右端または左端のソリューションを選択するという、お客様からの指示に従ってルールを設定しました。)

  2. 選択した pp セグメントでルートを使用できます。もちろん、これは fzero を使用するよりも高速で、かなり正確です。もちろん、ルートは複数のソリューションを返すため、正しいルートを選択する必要があります。これらの解の一部は、取り除くべき複素数である可能性があります。

  3. 3 次多項式の根の陽解を使用できます。もちろん、再び複数のソリューションが返されるため、どのソリューションを使用するかに注意する必要があります。

コードを慎重に記述すれば、最後の解決策が最速です。実際、ベクトル化してすべての点を一度に解くことができます。(できたので、できると断言します。実は、当時私の下で働いていた生協の学生へのプログラミングの課題でした。)

あなたが pp フォームを適切に使用できなかった理由についての私の推測では、pp フォームがどのように機能するかを理解していないということです。もちろん、これはこれらのツールを適切に使用するために不可欠です。

スプラインの単一の pp セグメントをプロットしてみてください。ppval を使用して評価します。最初はうまく動作しないようですか?これは、これらのセグメントが左にシフトされていると誤解しているため、ANY 間隔の左側のエンドポイントが常にゼロであると想定されていることを意味します。これにより、スプラインのブレーク ポイントに応じて、3 次多項式セグメントがより正確に評価できるようになります。たとえば、[0 1 2 3] でブレークするスプラインと [1000001 1000001 1000002 1000003] でブレークするスプラインは、関数値が同一であれば、同じように機能するはずです。それ以外の場合に大きな数値を3乗すると、これが浮動小数点演算の数値問題になることに注意してください。

繰り返しますが、これはすべて慎重にベクトル化できると断言しますが、それには精神的な努力が必要でした。全体として最も簡単な解決策は、私が説明したように fzero を使用することです。

于 2011-11-04T10:29:52.647 に答える
0

を使用できますlsqnonlin

fun 引数をスプラインを評価する関数にし、目的の Y 値を減算して、目的の Y 値が達成されたときに結果がゼロになるようにします。

于 2011-11-04T04:37:22.067 に答える