Большие числовые ошибки в моей программе Mathematica - PullRequest
2 голосов
/ 16 декабря 2011

Вот часть моей программы.Посмотрите.

For[m = 1, m <= mode1, m++,
  For[n = 0, n <= mode2, n++,
    A[m, n][t_] = a[m, n]*Cos[\[Omega]*t];
    B[m, n][t_] = b[m, n]*Cos[\[Omega]*t];
  ]
]

temp = 0;
For[m = 1, m <= mode1, m++,
  For[n = 0, n <= mode2, n++,
    temp++;
    equation[temp] = 
      ExpandAll[Integrate[eqC[m, n]*Cos[\[Omega]*t], {t, 0, (2*Pi)/\[Omega]}]];
    equation[temp] = ExpandAll[Simplify[equation[temp]/10^9]];
    Print["\n\nEquation ", temp, "-\n", equation[temp]];
    temp++;
    equation[temp] = 
      ExpandAll[Integrate[eqS[m, n]*Cos[\[Omega]*t], {t, 0, (2*Pi)/\[Omega]}]];
    equation[temp] = ExpandAll[Simplify[equation[temp]/10^9]];
    Print["\n\nEquation ", temp, "-\n", equation[temp]];
  ]
]

После запуска этого кода я должен получить несколько уравнений, а затем создать из него матрицу с помощью ряда дифференцирований.Я знаю, что матрица должна быть симметричной.Проблема в том, что, когда я ввожу простые данные, то есть e = 1, h = 1 и т. Д., Я получаю точные результаты, и матрица симметрична, но как только я даю реальные данные, которые имеют значения, такие как 71.02e9,0.000247, происходят вычисленияошибиться, и я получаю несимметричную матрицу.Я тщательно проверил код и не могу найти ни одной ошибки с моей стороны.Я также проверил результаты программы для простого случая с ручными вычислениями.

Ответы [ 2 ]

7 голосов
/ 16 декабря 2011

Вы можете попытаться повысить точность своих вычислений, установив глобально, например, $MinPrecision=50 и указав значения своих данных с высокой точностью, используя либо foo = SetPrecision[0.000247,50], либо используя сокращение 0.000247`50.

2 голосов
/ 16 декабря 2011

В качестве дополнительной альтернативы вы можете использовать Rationalize[0.000247], а затем получить числовое значение с помощью N[expr, prec].В M - если вы даете неточный ввод, вы получаете неточный вывод, а для точного ввода вы получаете точный вывод.

...