Opened 11 years ago
Last modified 5 years ago
#9424 closed defect
FP evaluation of symbolic sums fails — at Version 13
Reported by: | burcin | Owned by: | burcin |
---|---|---|---|
Priority: | major | Milestone: | sage-6.8 |
Component: | symbolics | Keywords: | |
Cc: | whuss, kcrisman, eviatarbach | Merged in: | |
Authors: | Reviewers: | ||
Report Upstream: | N/A | Work issues: | |
Branch: | Commit: | ||
Dependencies: | Stopgaps: |
Description (last modified by )
Symbolics sums returned from maxima cannot be numerically evaluated, since they don't define an _evalf_()
method.
This was reported by dirkd on sage-support:
Why is evaluating this expression problematical? y1(x)=x^2;y2(x)=5-x; a0=1;an=3;Delta=(an-a0)/n;p(k)=a0+(k-1/2)*Delta; I(n)=sum(abs(y2(p(k))-y1(p(k)))*Delta,k,1,n); N(I(10)) SAGE respons: <snipped traceback> File "expression.pyx", line 3797, in sage.symbolic.expression.Expression.n (sage/symbolic/expression.cpp: 17022) TypeError: cannot evaluate symbolic expression numerically
Here is the thread:
http://groups.google.com/group/sage-support/t/615b15ca638c9652
See also #17422
Change History (13)
comment:1 Changed 11 years ago by
- Cc whuss added
comment:2 Changed 11 years ago by
- Cc kcrisman added
comment:3 Changed 8 years ago by
- Cc eviatarbach added
comment:4 Changed 8 years ago by
- Milestone changed from sage-5.11 to sage-5.12
comment:5 Changed 8 years ago by
- Milestone changed from sage-6.1 to sage-6.2
comment:6 Changed 7 years ago by
- Milestone changed from sage-6.2 to sage-6.3
comment:7 Changed 7 years ago by
- Milestone changed from sage-6.3 to sage-duplicate/invalid/wontfix
- Status changed from new to needs_review
comment:8 Changed 7 years ago by
- Milestone changed from sage-duplicate/invalid/wontfix to sage-6.3
- Type changed from defect to enhancement
I don't think any of these invalidate the ticket; the point is to extend the behavior. Why is 1. a problem? This seems like it should be a nice function to me. See Burcin's reply in the thread:
> If I leave out the N( )-operator on the last line the block evaluates > to > > > 1/500*sum(abs(-4*k^2 - 56*k + 329), k, 1, 10) > > which can be evaluated in a new inputbox. Why not in one step? The result returned from maxima uses a symbolic function object created on the fly. This is quite different from the sum() function available on the command line, and unfortunately, it doesn't define a numerical evaluation function, _evalf_().
Burcin knows this code very well, so I would be surprised if he misdiagnosed this. But I figure maybe changing to enhancement will appease everyone :)
comment:9 Changed 7 years ago by
Burcin is spot-on:
sage: S=(I(10).operands()[0].operator()); S sum sage: type(S) <class 'sage.symbolic.function_factory.NewSymbolicFunction'>
(Note the "New", not "BuiltIn?" or similar. It's a completely generic placeholder) we just need a symbolic function hooked up that can do some mildly intelligent evaluation when asked for it.
Incidentally, we can just map back to maxima and do the right thing there:
sage: maxima_calculus(I(10)) ('sum(abs(4*_SAGE_VAR_k^2+56*_SAGE_VAR_k-329),_SAGE_VAR_k,1,10))/500 sage: SR(maxima_calculus(I(10)).simplify_sum()) 1301/250
(I haven't checked if it's correct). You can see why the "simplify_sum" is required: the newly created "sum" function in SR is linked to the inert "'sum".
comment:10 Changed 7 years ago by
- Status changed from needs_review to needs_work
comment:11 Changed 7 years ago by
- Milestone changed from sage-6.3 to sage-6.4
comment:12 follow-up: ↓ 13 Changed 7 years ago by
comment:13 in reply to: ↑ 12 Changed 7 years ago by
- Description modified (diff)
- Summary changed from numerical evaluation of symbolic sums to FP evaluation of symbolic sums fails
Replying to kcrisman:
Maybe it's time we fixed this.
It is not clear if forcing people to use N()
and getting a float, even if there is an integer simplification of the sum, is the right thing to do. Granted, the error thrown on N(I(10))
is a bug, and this ticket is about it. Here is a minimal example:
sage: (k,n) = var('k,n') sage: f(n)=sum(abs(-k*k+n),k,1,n) sage: f(n=8) sum(abs(-k^2 + 8), k, 1, 8) sage: N(f(8))
However, I would expect f(n=8).simplify()
or .expand()
to give me the result 162
, and this is #17422
Your problem is threefold: 1. you use
n
both as sum endpoint and variable, 2. Sagesum
is only intended with symbolic endpoints, and 3. the need to use Python summation may require defining a Python function instead of a Sage symbolic function: