首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何计算变量的值?

如何计算变量的值?
EN

Stack Overflow用户
提问于 2012-11-25 12:10:13
回答 3查看 3.2K关注 0票数 1

我需要知道如何得到一个带有变量的方程,并让它计算并输出该变量的值。方程式的例子。

2900 =1*T* ((52 + 6) / 12)

我需要程序获取所有的值,并给我'T‘的值。我们将非常感谢您的任何帮助:)

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-11-25 12:26:01

首先将方程重新排列为T=...形式。

代码语言:javascript
运行
复制
2900 = 1 * T * ((52 + 6) / 12)

变成(例如)

代码语言:javascript
运行
复制
T = 2900/(52 + 6) * 12 / 1

接下来,将数字替换为变量

代码语言:javascript
运行
复制
T = a/(b + c) * d / e

然后编写一个函数来计算给定a-e的T

代码语言:javascript
运行
复制
double T(double a, double b, double b, double c, double d, double e) {
 return  a/(b + c) * d / e;
}

然后像这样使用它

代码语言:javascript
运行
复制
double T = T(2900, 52, 6, 12, 1)
票数 1
EN

Stack Overflow用户

发布于 2012-11-25 13:18:17

如果方程是相同的,只有参数改变-然后只需将其重新排列为变量。

如果整个等式是用户输入,那么它很快就会变得丑陋("2*cos(log(x^3)) =- e^tg(x)"),并且没有银弹。你能做的最简单的事情就是在运行时评估它(例如使用NCalc),并“强制”解决方案。

票数 3
EN

Stack Overflow用户

发布于 2012-11-25 14:33:59

下面是一个糟糕的解决方案,使用CSharpCodeProvider将等式编译为代码,然后使用简单的二进制搜索来搜索T值。

代码语言:javascript
运行
复制
using Microsoft.CSharp;
using System;
using System.CodeDom.Compiler;
using System.Linq;
using System.Reflection;

namespace EquationSolver
{
    public class EquationSolver
    {
        MethodInfo meth;
        double ExpectedResult;
        public EquationSolver(string equation)
        {
        var codeProvider = new CSharpCodeProvider();            
        var splitted = equation.Split(new[] {'='});

        ExpectedResult = double.Parse(splitted[0]);

        var SourceString = "using System; namespace EquationSolver { public static class Eq { public static double Solve(double T) { return "+
            splitted[1] + ";}}}";

        System.CodeDom.Compiler.CompilerParameters parameters = new CompilerParameters();
        parameters.GenerateInMemory = true;


        CompilerResults results = codeProvider.CompileAssemblyFromSource(parameters, SourceString);

        var cls = results.CompiledAssembly.GetType("EquationSolver.Eq");
        meth = cls.GetMethod("Solve", BindingFlags.Static | BindingFlags.Public);

    }

    public double Evaluate(double T)
    {            
        return (double)meth.Invoke(null, new[] { (object)T });
    }

    public double SearchT(double start, double end, double tolerance)
    {            
        do
        {
            var results = Enumerable.Range(0, 4).Select(x => start + (end - start) / 3 * x).Select(x => new Tuple<double, double>(
                x, Evaluate(x))).ToArray();
            foreach (var result in results)
            {
                if (Math.Abs(result.Item2 - ExpectedResult) <= tolerance)
                {
                    return result.Item1;
                }
            }
            if (Math.Abs(results[2].Item2 - ExpectedResult) > Math.Abs(results[1].Item2 - ExpectedResult))
            {
                end -= (end - start) / 3;                    
            }
            else
            {
                start += (end - start) / 3;
            }
        } while (true);
    }
  }


}

就目前而言,它有严重的局限性:

必须首先说明预期的结果(在你的例子中是2900)。要解的等式必须在等号后面说明,只有一个变量,名为T。T本身可以存在于多个地方通过equation.

  • Since编译代码,您可以使用

  • 函数,但这也意味着输入可能被滥用的方式比任何.NET injection.

  • It's二进制搜索更糟糕。因此,如果你的等式不是一个简单的线性方程,它将失败。

  • 因为整数运算总是导致整数,而没有小数点的普通数字被C#解析为整数,如果你想要双精度结果,数字必须明确地这样设置(在你的方程中,52,6或12中的至少一个必须写上小数点,例如52.0)

使用示例:

代码语言:javascript
运行
复制
var eq = new EquationSolver( "2900 = 1 * T * ((52 + 6.0) / 12)");
var r = eq.SearchT(int.MinValue,int.MaxValue,0.001);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13548179

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档