Я следую Обзору вычислительной физики Ландау и решаю эту задачу (часть b):
Я написал код для создания 4 решений ниже. Я смущен тем, что автор хочет, чтобы я сделал здесь.
При тестировании на наличие ошибок вычитания это так же просто, как вычитание результата 1 из результата 2? Суть в том, чтобы увидеть, как машина искажает вычитание из-за округления, поэтому я никак не могу получить точный ответ от машины, верно?
Что касается моего решения этой проблемы, я обнаружил, что использование
c=10^-1
приводит к1.38777878078145e-17
для метода 1 и1.11022302462516e-16
для метода 2. Когда я увеличиваю его доc=10^-16
(без получения в результатеinf
), я получаю-1.10223024625156e-17
для метода 1 и-0.0992800745259007
для метода 2. Это говорит мне о том, что для метода 2 произошло очень большое изменение значения, когда я модифицировалc
. Но я не думаю, что улавливаю суть того, что автор хочет, чтобы я понял здесь.
Если вы хотите увидеть код, вот он. В противном случае вы можете увидеть пример вывода ниже:
import Foundation
var a: Double = 1.0
var b: Double = 1.0
var c: Double = pow(10,-16)
var x: Double = 0.0
//The following variables are just used to run the calculations within
//the functions, i.e. they can be reused within each function definition
var x1: Double = 0.0
var x2: Double = 0.0
func x_func(a_var: Double, b_var: Double, c_var: Double) -> Double {
x1 = 0.0
x2 = 0.0
x = 0.0
x1 = pow(b,2.0)-4.0*a*c
x2 = -b + x1.squareRoot()
x = x2/(2.0*a)
return x
}
func x_func2(a_var: Double, b_var: Double, c_var: Double) -> Double {
x1 = 0.0
x2 = 0.0
x = 0.0
x1 = pow(b,2.0)-4.0*a*c
x2 = -b - x1.squareRoot()
x = x2/(2.0*a)
return x
}
func xp_func(a_var: Double, b_var: Double, c_var: Double) -> Double {
x1 = 0.0
x2 = 0.0
x = 0.0
x1 = pow(b,2.0)-4.0*a*c
x2 = x1.squareRoot() + b
x = -2.0*c/x2
return x
}
func xp_func2(a_var: Double, b_var: Double, c_var: Double) -> Double {
x1 = 0.0
x2 = 0.0
x = 0.0
x1 = pow(b,2.0)-4.0*a*c
x2 = b - x1.squareRoot()
x = -2.0*c/x2
return x
}
print("Method 1: Positive")
print(x_func(a_var: a, b_var: b, c_var: c))
print(" \n")
print("Method 1: Negative")
print(x_func2(a_var: a, b_var: b, c_var: c))
print(" \n")
print("Method 2: Positive")
print(xp_func(a_var: a, b_var: b, c_var: c))
print(" \n")
print("Method 2: Negative")
print(xp_func2(a_var: a, b_var: b, c_var: c))
print(" \n")
print("Subtractive cancellation error for Method 1:")
print(" \n")
print("Method 1 (positive) minus Method 2 (positive)",x_func(a_var: a, b_var: b, c_var: c) - xp_func(a_var: a, b_var: b, c_var: c))
print(" \n")
print("Subtractive cancellation error for Method 2:")
print(" \n")
print("Method 1 (negative) minus Method 2 (negative)",x_func2(a_var: a, b_var: b, c_var: c) - xp_func2(a_var: a, b_var: b, c_var: c))
Пример вывода:
Method 1: Positive
-1.11022302462516e-16
Method 1: Negative
-1.0
Method 2: Positive
-1e-16
Method 2: Negative
-0.900719925474099
Subtractive cancellation error for Method 1:
Method 1 (positive) minus Method 2 (positive) -1.10223024625156e-17
Subtractive cancellation error for Method 2:
Method 1 (negative) minus Method 2 (negative) -0.0992800745259007
x1
,x2
). - person Martin R   schedule 03.02.2017