2014-10-07 2 views
0

У меня есть уравнение, которое проявляется так:Решая первое уравнение степени - оптимизации кода

general equation

где А и Х имеет два вектора чисел и N> 2 ввод пользователя (каждый раз разные), а G - числовая константа, а Y - переменная, которую я бы хотел найти. Выполнение некоторых вычислений, я бы сказал, что решение может быть обобщено следующим образом (это проверено):

general formula

Так вот мой вопрос. Код, который в настоящее время решает уравнение, использует метод деления пополам, то есть он оценивает значение Y, заменяя его итеративным образом его значение внутри формулы до тех пор, пока глобальное значение выражения не будет достаточно близко к 0 (не имеют доступа к коду , поэтому я не могу сказать дополнительную информацию о уровнях разрыва или его структуре, к сожалению).

Однако я думал о реализации кода, вычисляющего код, как показано в решении (вторая формула) выше. Это моя попытка:

num = 0 
den = 0 
For j = 1 To N 
    prods = 1 
    For k = 1 To N 
     If k <> j Then 
      prods = prods * X(k) 
     End If 
    Next k 
    num = num + prods 
    den = den + (prods/A(j)) 
Next j 
Y = num/den 

Я никогда не изучал любую компьютерную науку, так что я не в состоянии оценить себя качество этого метода w.r.t. классический делящий пополам. Не могли бы вы рассказать о том, как я должен понимать, какой из двух кодов работает лучше, и, если возможно, некоторые объяснения? Заранее спасибо.

Примечание: не может предоставить достаточную информацию для надлежащего анализа. Я не ожидаю подробного результата. Я просто хотел бы получить мнение некоторых экспертов «на первый взгляд», будучи я не один из вас :)

+0

Есть ли какой-то причине вы не используя формулу «Y = sum_j (1/X (j))/sum_j (1/(A (j) * X (j)))? –

+0

Деление на нижнюю сумму выполняется внутри самой суммы, поэтому я думаю, что разделение, которое вы говорите, не представляется возможным математически. Пример с N = 2: 'y = [x (1) + x (2)]/[[x (2)/A (1)] + [x (1)/A (2)]]'. –

+0

У меня была неправильная формула в первом комментарии меньше минуты, но тот, который там теперь получается, делит числитель и знаменатель вашей правой стороны на 'product_j X (j)'. –

ответ

1

числитель и знаменатель вашего решения по product_j X(j), чтобы получить формулу

 N 
     --- 1 
     \ ---- 
    / X(j) 
     --- 
     j=1 
Y = -------------- , 
    N 
    ---  1 
    \ --------- 
    / A(j) X(j) 
    --- 
    j=1 

, который может быть оценен прямолинейно в линейном времени, используя примерно столько же операций, сколько требуется для оценки левой части первого уравнения, которое является основной частью одной итерации деления пополам. По модулю возможность скрытия числовых задач точности, я бы сказал, что прямой метод превосходит пополам.

+0

Большое спасибо, я протестировал и понял, что вы правы. Для того, как данные входят в функцию, я бы сказал, что ваш метод требует только N итераций, не может представить себе более быстрый способ! –

1

я получаю это решение от упрощений

enter image description here

, которая решается для

enter image description here

С тривиального решения

Sub Main() 

    Dim A() As Double, X() As Double 
    Dim j As Integer, N As Integer = ... 

    A = New Double(N) {...} 
    X = New Double(N) {...} 

    Dim num As Double = 0, den As Double = 0 

    For j = 1 To N 
     num = num + 1/X(j) 
     den = den + 1/(A(j) * X(j)) 
    Next 

    Dim Y = num/den 

End Sub 
+0

Спасибо, я, ради справедливости, я одобрил ответ Дэвида с тех пор, как он пришел первым. Спасибо! –

Смежные вопросы