Статья в Википедии о Secant Method включает в себя хороший макет последовательных значений x_n, которые я здесь вырезал:
![image](https://upload.wikimedia.org/math/a/c/5/ac553e8eaa0584b0d7916cfad6cc0895.png)
![image](https://upload.wikimedia.org/math/1/f/9/1f96e71000c9d546ea23f6a767e6b5e9.png)
...
![image](https://upload.wikimedia.org/math/f/9/8/f9808321e7d8c7dc390ff7f0f1fe826d.png)
Вам необходим метод secant
для итеративного вычисления этих значений x_n, пока либо (a) вы не поймете, что метод расходится, и выне может найти решение или (b) ваши последующие значения x_n изменяются на достаточно малые суммы, чтобы вы могли с радостью назвать результат корнем.
Поэтому вам понадобится функция f
, которую можно вызвать для вычисленияВаше уравнение:
double f(double Ts, double v, double b, double alpha, double kr, double Uc, double q) {
double first = pow(v/b, 2.0) * sin(alpha);
double second = kr * pow(Ts, 4.0) + Uc * Ts - q;
return first - second;
}
Обязательно проверьте порядок операций.:) Написание уравнений в HTML всегда ненадежно.
Далее вам нужно написать цикл, который проверяет условия выхода:
x_0 = /* some guess */
x_1 = x_0 + .01 /* or similar */
while ( (fabs(x_0 - x_1) > EPSILON) && (fabs(x_0 - x_1) < DIVERGENCE) ) {
x_new = x_1 - f(x_1, /* rest */) * (x_1 - x_0) / (f(x_1, /* rest */) - f(x_0, /* rest */));
x_0 = x_1;
x_1 = x_new;
}
Вы могли бы рассмотреть возможность скрыть всеаргументы f()
, которые не решаются с помощью макроса.Это поможет убедиться, что вы получите все аргументы в правильном порядке.
И определенно рассмотрите решение гораздо более простых функций, таких как x^2 - 17 == 0
, прежде чем переходить к многомерной функции.(Это также уберет запутанный двойной внутренний цикл, который вы получили сейчас. Это всего лишь рецепт для умножения любых ошибок в несколько сотен раз.:)