0

私はPythonにかなり慣れていないので、特定の2次関数を解くためのコードを記述しようとしています。フロートの丸め誤差に問題があります。これは、非常に大きい2つの数値を非常に小さい差で除算しているためだと思います。(また、今のところ、すべての入力に実際の解があると仮定しています。)問題を示すために、2次方程式の2つの異なるバージョンを配置しました。ほとんどの入力で問題なく動作しますが、、を試してみると、a = .001大きな違いがある2つの答えが得られます。これが私のコードです:b = 1000c = .001

from math import sqrt

a = float(input("Enter a: "))
b = float(input("Enter b: "))
c = float(input("Enter c: "))

xp = (-b+sqrt(b**2-4*a*c))/(2*a)
xn = (-b-sqrt(b**2-4*a*c))/(2*a)

print("The solutions are: x = ",xn,", ",xp,sep = '')

xp = (2*c)/(-b-sqrt(b**2-4*a*c))
xn = (2*c)/(-b+sqrt(b**2-4*a*c))

print("The solutions are: x = ",xn,", ",xp,sep = '')
4

5 に答える 5

1

私は数学分野の専門家ではありませんが、コンピューターの内部数値表現が実際の数学と一致しないため、numpy (数学用の py モジュール) を使用する必要があると思います。(浮動小数点演算)

http://docs.python.org/2/tutorial/floatingpoint.html

これがあなたが望むものとほぼ同じであることを確認してください。

http://www.annigeri.in/2012/02/python-class-for-quadratic-equations.html

于 2012-12-28T17:00:37.007 に答える
1

浮動小数点でより正確な結果を得るには、同様の量を減算しないように注意してください。二次の場合、根と作るx^2 + a x + b = 0ことがわかりますx1x2

b = x1 * x2

絶対値が大きい方を計算し、この関係からもう一方を求めます。

于 2012-12-28T17:06:38.603 に答える
0

前述のnumpyモジュールは、質問で言及されている丸め誤差とは特に関係がありません。一方、10進モジュールは、正確な計算を行うためにブルートフォース方式で使用できます。次のipythonインタープリターセッションのスニペットは、その使用法(デフォルトでは28桁の精度)を示しており、対応する浮動小数点計算の精度は小数点以下5桁しかないことも示しています。

In [180]: from decimal import Decimal
In [181]: a=Decimal('0.001'); b=Decimal('1000'); c=Decimal('0.001')
In [182]: (b*b - 4*a*c).sqrt()
Out[182]: Decimal('999.9999999979999999999980000')
In [183]: b-(b*b - 4*a*c).sqrt()
Out[183]: Decimal('2.0000000000020000E-9')
In [184]: a = .001; b = 1000; c = .001
In [185]: math.sqrt(b*b - 4*a*c)
Out[185]: 999.999999998
In [186]: b-math.sqrt(b*b - 4*a*c)
Out[186]: 1.999978849198669e-09
In [187]: 2*a*c/b
Out[187]: 1.9999999999999997e-09

平方根のテイラー級数4acは、がに比べて小さい場合に使用する代替方法を提供しますb**2。この場合√(b*b-4*a*c) ≈ b - 4*a*c/(2*b)、、whence b - √(b*b-4*a*c) ≈ 2*a*c/b。上記の[187]行のエントリに示されているように、テイラー級数の計算では、Decimalの代わりに浮動小数点を使用しながら12桁の精度の結果が得られます。別のテイラー級数項を使用すると、さらに数桁の精度が追加される可能性があります。

于 2012-12-28T17:58:49.547 に答える
0

ソリューション:

ユーザー dhunter によって提案されたNumpyは、通常、Python での数学の最適なソリューションです。numpy ライブラリは、さまざまな分野で迅速かつ正確な計算を行うことができます。

10 進数データ型は Python 2.4 で追加されました。外部ライブラリをダウンロードしたくなく、多くの長いまたは複雑な方程式を実行する予定がない場合は、10 進数データ型が適している可能性があります。追加するだけです:

from decimal import *

コードの先頭に移動し、float という単語のすべてのインスタンスを Decimal という単語に置き換えます (大文字の "D" に注意してください)。

例:Decimal(1.1047262519)とは対照的にfloat(1.1047262519)

仮説:

浮動小数点演算はバイナリ演算に基づいているため、必ずしもユーザーが期待するとおりになるとは限りません。フロート対の優れた説明。小数型はここにあります

于 2012-12-28T17:25:34.480 に答える
0

対処する必要がある特殊なケースがあります。

  1. a == 0 は、線形方程式と 1 つの根を意味します。x = -c/b
  2. b == 0 は、x1、x2 = ±sqrt(-c/a) の形式の 2 つの根を意味します。
  3. c == 0 は 2 つの根を意味しますが、そのうちの 1 つがゼロです。x*(ax+b) = 0
  4. 判別式が負の場合、2 つの複素共役根があります。

この方法で判別式を計算することをお勧めします。

discriminant = b*sqrt(1.0-4.0*a*c/b)

これも読むことをお勧めします:

https://math.stackexchange.com/questions/187242/quadratic-equation-error

于 2012-12-28T17:53:47.237 に答える