/// <inheritdoc/> public override string Print(SineOperNode node) { switch (node.SineFunction) { case SineFunction.SINE: return($"\\sin{{{node.Child.Print(this)}}}"); case SineFunction.COSINE: return($"\\cos{{{node.Child.Print(this)}}}"); case SineFunction.TANGENT: return($"\\tan{{{node.Child.Print(this)}}}"); case SineFunction.COSECANT: return($"\\csc{{{node.Child.Print(this)}}}"); case SineFunction.SECANT: return($"\\sec{{{node.Child.Print(this)}}}"); case SineFunction.COTANGENT: return($"\\cot{{{node.Child.Print(this)}}}"); default: return(null); } }
private static ExpNode SineTable(SineOperNode node) { return(node.SineFunction switch { SineFunction.SINE => new SineOperNode(SineFunction.COSINE) { Child = node.Child }, SineFunction.COSINE => QuickOpers.Negative(new SineOperNode(SineFunction.SINE) { Child = node.Child }), _ => node, });
/// <inheritdoc/> public override ExpNode Execute(SineOperNode node) { if (node.IsConstantBy(_variable)) { return(QuickOpers.MakeNumericalNode(0)); } // Apply chain rule var coefficient = node.Child.Clone().Execute(this); // Apply table var sinFunc = SineTable(node); return(QuickOpers.Multiply(coefficient, sinFunc)); }
/// <inheritdoc/> public override ExpNode Execute(SineOperNode node) { if (node.IsConstantBy(_variable)) { return(ConstantRule(node)); } Differentiator diff = new(_variable); // Apply ChainRule var coefficient = node.Child.Execute(diff); // Apply table var sinFunc = SineTable(node); return(QuickOpers.Multiply(QuickOpers.Reciprical(coefficient), sinFunc)); }
/// <inheritdoc/> public override ExpNode Execute(SineOperNode node) { node.Child = node.Child.Execute(this); if (node.Child is NumericalValueNode nvNode) { double value = 0; switch (node.SineFunction) { case SineFunction.SINE: value = Math.Sin(nvNode.DoubleValue); break; case SineFunction.COSINE: value = Math.Cos(nvNode.DoubleValue); break; case SineFunction.TANGENT: value = Math.Tan(nvNode.DoubleValue); break; case SineFunction.COSECANT: value = 1 / Math.Sin(nvNode.DoubleValue); break; case SineFunction.SECANT: value = 1 / Math.Cos(nvNode.DoubleValue); break; case SineFunction.COTANGENT: value = 1 / Math.Tan(nvNode.DoubleValue); break; } return(QuickOpers.MakeNumericalNode(value)); } return(node); }
/// <summary> /// Executes operation on a <see cref="SineOperNode"/>. /// </summary> /// <param name="node">The <see cref="SineOperNode"/> to execute operation on.</param> /// <returns>The result of the operation on a <see cref="SineOperNode"/>.</returns> public virtual ExpNode Execute(SineOperNode node) => Execute((UOperNode)node);
/// <summary> /// Prints a <see cref="SineOperNode"/>. /// </summary> /// <param name="node">The <see cref="SineOperNode"/> to print.</param> /// <returns>The <see cref="SineOperNode"/> printed to a string.</returns> public virtual string Print(SineOperNode node) => Print((UOperNode)node);