2011-12-16 6 views
2

Вот часть моей программы. Взгляни.Большие числовые ошибки в моей программе Mathematica

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, чтобы быть неправильным, и я получаю несимметричную матрицу. Я тщательно проверил код и не могу найти ни одной ошибки с моей стороны. Я также проверил результаты программы для простого случая с ручными расчетами.

+1

Ваше сообщение на самом деле не содержит четкого вопроса, и вы не предоставили достаточной информации для запуска вашего кода (который не написан в обычном стиле Mathematica - это слишком важно). Однако ваша проблема, вероятно, просто потеря [точности] (http://reference.wolfram.com/mathematica/guide/NumericalEvaluationAndPrecision.html). Два значения «реальных данных», которые вы дали, будут интерпретироваться как номера «MachinePrecision». Либо используйте точные числа, либо используйте точность до 30, используя '71.02'30 *^9'' и' '0.000247'30''. Вы также должны попытаться использовать встроенные функции преобразования Фурье – Simon

+1

Итак, у вас есть все эти As и Bs в начале, но не в следующем блоке. И вы ссылаетесь на e = 1 и h = 1, хотя e и h не находятся нигде в коде. На догадках похоже, что вы пытаетесь решить для коэффициентов серии Фурье или что-то ??? –

+0

Да, я согласен с тем, что код, который я написал, может быть не самым элегантным способом программирования в математике. Я на самом деле новичок в языке. Я не пытаюсь разработать преобразование Фурье, я решаю уравнение с частными производными вибрации оболочки, используя метод galerkin. Также «e» и «h» фактически находятся в eqC [m, n] и eqS [m, n], которые были объявлены ранее. –

ответ

7

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

2

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

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