3

Представьте себе что-то вродеСтрока манипуляции подстановки типа Строка в математическом выражении

exp(49/200)+(x-49/200) 

Я хочу передать в качестве аргумента функции «roundn» любой операции, которая не является addtion или вычитанием Таким образом, мое выражение стало

roundn(exp(roundn(49/200, n)), n) + (x - roundn(49/200, n) 

Ну выражение, которое я хочу, чтобы манипулировать это:

exp(49/200)+exp(49/200)*(x-49/200)+1/2*exp(49/200)*(x-49/200)^2+1/6*exp(49/200)*(x-49/200)^3+1/24*exp(49/200)*(x-49/200)^4+1/120*exp(49/200)*(x-49/200)^5+1/720*exp(49/200)*(x-49/200)^6+1/5040*exp(49/200)*(x-49/200)^7+1/40320*exp(49/200)*(x-49/200)^8+1/362880*exp(49/200)*(x-49/200)^9+1/3628800*exp(49/200)*(x-49/200)^10+1/39916800*exp(49/200)*(x-49/200)^11 
+5

Что вопрос? – Ber 2010-11-23 09:29:37

+0

Разделить последнюю строку кода. – 2010-11-23 09:46:23

+0

Я думаю, вы имеете в виду функцию `round()`, описанную в документах [здесь] (http://docs.python.org/library/functions.html?highlight=round#round). – martineau 2010-11-23 11:38:28

ответ

0

Вы можете использовать каждое соответствие, например, p=re.compile(r'\d+/\d+') с выходом функции roundn. FYI, аппроксимируя так много терминов в вашем выражении, даст результат, который не обязательно очень близок к фактическому результату, в зависимости от того, сколько цифр вы округлите.

6

Возможно, вы думаете, что хотите это сделать, но вы действительно не хотите этого делать. Новые Pythoners обычно думают, что им нужно округлять числа с плавающей запятой, потому что когда они оцениваются, они получают неожиданные результаты (например, 1.0/10 = 0.100000000000001). Вместо того, чтобы делать некоторую тупическую замену строк в вашем выражении, я просто создал переменную для round(49/200,n) и сделал небольшую очистку формата. Также exp(49/200) не нужно оценивать 13 раз, просто сделайте это один раз и обратитесь к вычисленному значению.

zz = round(49/200,n) 
e_zz = exp(zz) 
ans = (e_zz + 
    e_zz * (x-zz) + 
    1/2 * e_zz * (x-zz)**2 + 
    1/6 * e_zz * (x-zz)**3 + 
    1/24 * e_zz * (x-zz)**4 + 
    1/120 * e_zz * (x-zz)**5 + 
    1/720 * e_zz * (x-zz)**6 + 
    1/5040 * e_zz * (x-zz)**7 + 
    1/40320 * e_zz * (x-zz)**8 + 
    1/362880 * e_zz * (x-zz)**9 + 
    1/3628800 * e_zz * (x-zz)**10 + 
    1/39916800 * e_zz * (x-zz)**11) 

Поднятие e к округленному числу практически не подходит. Точно так же для увеличения округленного числа до 11-й степени. (Заметим также, что в Python, оператор возведения в степень **, не ^.)

Отредактировано: Если С. Лотт не предложил алгебраическую упрощение, я бы оставил это как есть. Но * e_zz может быть вынесена из каждого члена, что дает более простой (и, вероятно, быстрее):

zz = round(49/200,n) 
e_zz = exp(zz) 
ans = e_zz * (1 + 
    (x-zz) + 
    1/2 * (x-zz)**2 + 
    1/6 * (x-zz)**3 + 
    1/24 * (x-zz)**4 + 
    1/120 * (x-zz)**5 + 
    1/720 * (x-zz)**6 + 
    1/5040 * (x-zz)**7 + 
    1/40320 * (x-zz)**8 + 
    1/362880 * (x-zz)**9 + 
    1/3628800 * (x-zz)**10 + 
    1/39916800 * (x-zz)**11) 
1

Интересно ли это то, что вам нужно:

Если исходное уравнение в строке переменной eq вы можете создать новые уравнения, используя метод replace строк:

eq.replace('49/200', 'roundn(49/200,n)') 

и аналогичное выражение может поставить roundn вокруг функции exp() (поз Здесь нужно какое-то отличное регулярное выражение).

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

  • Нет связанных вопросов^_^