三元一次方程组算法_C#求解2元一次方程组改进算法,最优化算法,梯度下降法...

结合数学和编程,本文介绍了使用C#优化算法求解2元一次方程组,并探讨了梯度下降法。文章详细解释了最优化算法的思路,包括找到目标函数、调整参数以达到最小值。同时,提及了导数与最小值的关系及其计算方法。代码示例展示了逐步解方程的过程。
摘要由CSDN通过智能技术生成

当数学和编程结合起来的时候,就很有意思了,就有一定的智能化了。

梯度下降法

C#求解2元一次方程改进算法,最优化算法

这篇文章是上一篇文章的后续。

上一篇文章

C#和数学,System.Math,求解2元一次方程组

最优化算法的思路:

找到目标函数

调整参数

使得目标函数到达最小

d4d7295e3dbe12c2b53dcd7672958cff.png

导数是什么?

导数和最小值有什么关系?

导数怎么算?

这是高等数学里面的内容。

有兴趣的可以发来讨论。

当数学和编程结合起来的时候,就很有意思了,就有一定的智能化了。

代码

//x+y=3
//2x+3y=8
//求x和y
using System;

namespace math_example
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
            Test.JieFangCheng();
            
           


        }
    }
   static class Test{

      public   static void JieFangCheng(){
        Console.WriteLine("利用最优化思路来解方程组");


      

        //x+y=3
        //2x+3y=8
        double x=0;
        double xNew=0;//调整后的x
        double y1=0;
        double y2=0;
        y1=3-x;
        y2=(8-2*x)/3;
        double mubiao=Math.Pow((y1-y2),2);//目标
        
        Console.WriteLine($"刚开始目标是多少:{mubiao}");
        Console.WriteLine($"让目标变小");
        double daoshu=2*(y1-y2)*(-1+2/3);//求导
        double step=10;  //step设置为0.01,0.1,1,10看看有什么不同。
        xNew=x-daoshu*step;//调整x
        y1=3-xNew;
        y2=(8-2*xNew)/3;
        mubiao=Math.Pow((y1-y2),2);
        Console.WriteLine($"调整以后的目标是多少:{mubiao}");//是不是下降了

       
          
        

     }     


    }
 
}

上面的代码,按照step by step的思路做了讲解。

下面的代码,进行了解方程

//x+y=3
//2x+3y=8
//求x和y
using System;
using System.Collections.Generic;

namespace math_example
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
            Test.JieFangCheng();
            
           


        }
    }
   static class Test{

      public   static void JieFangCheng(){
        Console.WriteLine("利用最优化思路梯度下降法来解方程组");


        //x+y=3
        //2x+3y=8
        int COUNT=600;//调整最大次数
        double step=0.1;//调整的步长
        double kaojinzero=0.0000000001;
        double x_jie=0;
        double y_jie=0;
        double x=0;//在循环体里面会调整的变量
        double y1=0;//
        double y2=0;//
        double mubiao=0;//目标函数
        double daoshu=0;//导数
        bool findIt=false;//刚开始没找到
        List<double> see_mubiao=new List<double>();
        
        
        for(int i=0;i<COUNT;i++){
           y1=3-x;
           y2=(8-2*x)/3;
           mubiao=Math.Pow(y1-y2,2);
           see_mubiao.Add(mubiao);

           if(mubiao<kaojinzero){  //与0的接近程度
              x_jie=x;
              y_jie=y1;
              findIt=true;
              Console.WriteLine($"找到了解x={x_jie},y={y_jie}");
              break;
                
           } else {
 
             daoshu=2*(y1-y2)*(-1+2/3);
             x=x-daoshu*step;//调整x

           }
           
           


        }//跳出循环
       if(!findIt){
        Console.WriteLine("没有找到合适的解,请再检查一遍");
      }
       //看看目标变化
       foreach(var item in see_mubiao){
         Console.WriteLine($"{item}");
       }
       //如果是用python,或者是R,可以plot出来。就可以看到目标函数在一直下降。
       //在c#里面,有没有类似的功能,怎么写呢。
  

       
          
        

     }     


    }
 
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值