On Tue, Nov 18, 2014 at 12:14 PM, Bill Page <bill.p...@newsynthesis.org> wrote:
> On 18 November 2014 13:41, Ondřej Čertík <ondrej.cer...@gmail.com> wrote:
>> On Tue, Nov 18, 2014 at 11:08 AM, Bill Page <bill.p...@newsynthesis.org> 
>> wrote:
>>> ...
>>> Have you had a chance to consider the issue of the chain-rule yet?
>>
>> Yes. Very straightforward, as I suggested in my last email. Just start with:
>>
>> D f / D z = df/dz + df/d conjugate(z) * e^{-2*i*theta}
>>
>> and then consider the chain rule for Wirtinger derivatives
>> (http://en.wikipedia.org/wiki/Wirtinger_derivatives#Functions_of_one_complex_variable_2),
>> I am sure that can be proven quite easily.
>
> Let me make sure I understand your proposal.  Are you saying that you
> would introduce the symbolic expression
>
>    e^{-2*i*theta}
>
> with theta undefined in the result of all derivatives?  So that
> diff(x) is always the sum of two terms. In particular
>
>   abs(x).diff(x)
>
> would return the symbolic expression
>
>   conjugate(x)/(2*abs(x)) + conjugate(x)/(2*abs(x))* e^{-2*i*theta}

I think you made a mistake, the correct expression is:

conjugate(x)/(2*abs(x)) + x/(2*abs(x)) * e^{-2*i*theta}

>
> If you are, then clearly one can recover both Wirtinger derivatives
> from this expression and the rest holds.

For now I just wanted to get the math right in the most general case.
I wasn't even considering what a CAS should do.

>
>> Then you just calculate directly:
>> ...
>> So it exactly agrees, except that there is a theta dependence in the
>> final answer and GiNaC implicitly chose theta=0.
>>...
>> I hope I didn't make some mistake somewhere, but it looks all
>> straightforward to me.
>>
>
> It looks OK to me but I must say, it probably seems rather peculiar
> from the point of view expressed earlier by David Roe.
>
> How can you explain the presence of the e^theta term to someone
> without experience in complex analysis or at least multi-variable
> calculus?
>
> I thought rather that what you were proposing was to set theta=0 from
> the start.  If you did that, then I think you still have problems with
> the chain rule.

For a CAS, I was leaning towards using theta=0. But given your
objections, I first needed to figure out the most general case that
covers everything. I think that's now sufficiently clarified.

> Let me add that the kind of solution to this problem that I did
> imagine was to implement two derivatives, for example both
>
>   f.diff(z) = df/dz + df/d conjugate(z)
>
> and
>
>   f.diff2(z) = df/dz - df/d conjugate(z)
>
> diff(z) would equal diff2(z) for all analytic functions and diff would
> reduce to the derivative of real non-analytic functions as you desire.

Right, diff() is for theta = 0. diff2() is for theta=pi/2, i.e. taking
the derivative along the imaginary axis.

> Note that for abs we have
>
>   abs(z).diff2(z) = 0

Actually, for abs you have:

abs(z).diff2(z) = (conjugate(z)-z)/(2*abs(z))

> but not in general.  There would be no need to discuss this 2nd
> derivative with less experienced users until they were ready to
> consider more "advanced" mathematics.
>
> Clearly we could implement the chain rule given these two derivatives.

So I think that functions can return their own correct derivative, for
example analytic functions just return the unique complex derivative,
for example:

log(z).diff(z) = 1/z

This holds for all cases. Non-analytic functions like abs(f) can return:

abs(f).diff(z) = (conjugate(f)*f.diff(z) +
f*conjugate(f).diff(z)*e^{-2*i*theta}) / (2*abs(f))

I think that's the correct application of the chain rule. We can set
theta=0, so we would just return:

abs(f).diff(z) = (conjugate(f)*f.diff(z) + f*conjugate(f).diff(z)) / (2*abs(f))

Which for real "f" (i.e. conjugate(f)=f) simplifies to (as a special case):

abs(f).diff(z) = (f*f.diff(z) + f*f.diff(z)) / (2*abs(f)) = f/abs(f) *
f.diff(z) = sign(f) * f.diff(z)

So it all works.

Unless there is some issue that I don't see, it seems to me we just
need to have one diff(z) function, no need for diff2().

Ondrej

-- 
You received this message because you are subscribed to the Google Groups 
"sage-devel" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to sage-devel+unsubscr...@googlegroups.com.
To post to this group, send email to sage-devel@googlegroups.com.
Visit this group at http://groups.google.com/group/sage-devel.
For more options, visit https://groups.google.com/d/optout.

Reply via email to