Перевод на язык C#
Формулировка задачи:
Доброго времени суток.
Помогите перевести код программки с C++ на C#.
Заранее благодарен
#include <iostream>
#include <vector>
using namespace std;
#include <mpreal.h>
using namespace mpfr;
// Точность по степенному ряду
#define eps_c "1e-50"
// Параметры системы уравнений Лоренца
#define sigma 10
#define r 28
#define b 8/(mpreal)3
// Количество бит под мантиссу вещественного числа
#define prec 180
// Как считать шаг: 1 - по оценке отрезка сходимости, 0 - заданная величина
#define FL_CALC 1
// Фиксированный шаг по времени
#define step_t "0.02"
// Функция возвращает длину отрезка сходимости степенного ряда
mpreal get_delta_t(mpreal &alpha0, mpreal &beta0, mpreal &gamma0)
{
mpreal h2 = (mpfr::max)((mpfr::max)(fabs(alpha0), fabs(beta0)), fabs(gamma0)),
h1 = (mpfr::max)((mpfr::max)(2*sigma, r+2*h2+1), b+2*h2+1);
mpreal h3 = h2 >= 1 ? h1 * h2 : (mpfr::max)((mpfr::max)(2*sigma, r+2), b+1);
return 1/(h3 + "1e-10");
}
// Функция вычисления значений фазовых координат в конечный момент времени
// x, y и z - координаты начальной точки; T - длина отрезка интегрирования;
// way - направление поиска решений: 1 - вперед по времени, -1 - назад по времени
void calc(mpreal &x, mpreal &y, mpreal &z, mpreal T, int way = 1)
{
cout << "\nВ начальный момент времени:\n\ndx/dt = " << sigma*(y-x) << "\ndy/dt = " <<
r*x-y-x*z << "\ndz/dt = " << x*y-b*z << endl;
mpreal t = 0, delta_t, L, p, s1, s2;
bool fl_rp;
do
{
if(FL_CALC)
delta_t = get_delta_t(x, y, z);
else
delta_t = step_t;
t += delta_t;
if(t < T)
fl_rp = true;
else if(t > T)
{
delta_t -= t-T;
fl_rp = false;
}
else
fl_rp = false;
vector<mpreal> alpha, beta, gamma;
alpha.push_back(x);
beta.push_back(y);
gamma.push_back(z);
int i = 0;
L = sqrt(alpha[0]*alpha[0] + beta[0]*beta[0] + gamma[0]*gamma[0]);
p = way * delta_t;
while(L > eps_c)
{
// Вычисляем новые коэффициенты степенных рядов
s1 = s2 = 0;
for(int j = 0; j <= i; j++)
{
s1 += alpha[j] * gamma[i-j];
s2 += alpha[j] * beta[i-j];
}
alpha.push_back(sigma*(beta[i] - alpha[i])/(i+1));
beta.push_back((r*alpha[i] - beta[i] - s1)/(i+1));
gamma.push_back((s2 - b*gamma[i])/(i+1));
i++;
x += alpha[i] * p;
y += beta[i] * p;
z += gamma[i] * p;
L = fabs(p) * sqrt(alpha[i]*alpha[i] + beta[i]*beta[i] + gamma[i]*gamma[i]);
p *= way * delta_t;
}
}
while(fl_rp);
cout << "\nКоординаты в конечный момент времени:\nx = " << x.toString() << "\ny = " <<
y.toString() << "\nz = " << z.toString() << endl;
cout << "\nЗначения производных:\n\ndx/dt = " << sigma*(y-x) << "\ndy/dt = " <<
r*x-y-x*z << "\ndz/dt = " << x*y-b*z << endl;
}
int main()
{
mpreal::set_default_prec(prec);
cout << "Машинный эпсилон = " << machine_epsilon() << endl;
mpreal T;
cout << "\nВведите длину отрезка времени > ";
cin >> T;
mpreal x, y, z;
cout << "\nx0 > ";
cin >> x;
cout << "y0 > ";
cin >> y;
cout << "z0 > ";
cin >> z;
cout << endl;
calc(x, y, z, T);
cout << "\n\n*** Проход назад ***\n";
calc(x, y, z, T, -1);
return 0;
}Решение задачи: «Перевод на язык C#»
textual
Листинг программы
void calc(mpreal &x, mpreal &y, mpreal &z, mpreal T, int way = 1)
{
cout << "\nВ начальный момент времени:\n\ndx/dt = " << sigma*(y-x) << "\ndy/dt = " <<
r*x-y-x*z << "\ndz/dt = " << x*y-b*z << endl;
mpreal t = 0, delta_t, L, p, s1, s2;
bool fl_rp;
do
{
if(FL_CALC)
delta_t = get_delta_t(x, y, z);
else
delta_t = step_t;
t += delta_t;
if(t < T)
fl_rp = true;
else if(t > T)
{
delta_t -= t-T;
fl_rp = false;
}
else
fl_rp = false;