Перевод на язык 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;

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 4.091 из 5
Похожие ответы